- 论坛徽章:
- 0
|
回复 1# jiachunzhou
最近几天查了一些资料,说说我自己对这种情况的理解,不对之处请大家指正
分几种情况讨论
SYBASE与ORACLE的锁机制是不相同的,SYBASE是悲观锁机制,而ORACLE是乐观锁机制
数据库加锁的目的是为了在多用户环境下协调各个事务的读与写的问题。
写的问题比较简单,无论是哪家数据库,再同一时刻,对同一条记录都只允许一个事务进行操作,这很好理解。
写有三种insert,update和delete,insert不去考虑,update和delete在进行操作的时候,通常会有where条件,而定位满足这些where条件的记录就需要对表进行读的操作。
对于同一条记录的访问,可能会有三种可能:
1、幻读:事务T1读取一条指定where条件的语句,返回结果集。此时事务T2插入一行新记录,恰好满足T1的where条件。然后T1使用相同的条件再次查询,结果集中可以看到T2插入的记录,这条新纪录就是幻想。
2、不可重复读取:事务T1读取一行记录,紧接着事务T2修改了T1刚刚读取的记录,然后T1再次查询,发现与第一次读取的记录不同,这称为不可重复读。
3、脏读:事务T1更新了一行记录,还未提交所做的修改,这个T2读取了更新后的数据,然后T1执行回滚操作,取消刚才的修改,所以T2所读取的行就无效,也就是脏数据。
为了解决读的一致性问题,数据库引入了“隔离级别”,在数据库标准中定义了四种隔离级别。
隔离级别从允许的并发副作用(例如,脏读或幻读)的角度进行描述。
ANSI/ISO SQL92标准中一共定义了四种隔离级别,分别是read uncommitted(未提交读),read committed(已提交读),repeatable read(可重复读),serializable(可序列化)
对于oracle来说,通常不加索引比加索引更有效率,因为当事务A锁住表中某一条记录是,另一个事务B在对数据表进行表扫描以匹配满足条件的记录时,由于oracle采用的是乐观锁机制,所以事务B并不会被挂起以等待事务A完成,事务B将直接从redo log中读取事务A锁定的记录进行判断是否满足条件(当然如果redo log中读取的数据正好满足事务B的条件,事务B也会等待直到事务A完成)。
而对于sybase来说,通常加索引比不加索引更有效率,因为当事务A锁住表中某一条记录以进行更改时,如果没有索引,另一事物B将进行表扫描以搜索满足条件的记录,在悲观锁机制情况下,事务B由于试图向事务A正在更改的记录加SHARE(共享)锁不成功而被挂起等待事务A完成,除非数据库将隔离级别配置为“未提交读,也即脏读”。而如果有索引的,将能通过索引直接定位锁需要的数据记录。
以上是最近几天查资料总结的,不知是否正确,欢迎各位大侠指正。
|
|