GBase 8s
隔离级别
为了避免以上并发可能产生的问题,数据库系统设计了不同的隔离级别。以下将以
GBase
软件中的隔离级别为例逐一介绍。
脏读(
Dirty Read
)
在其他数据库软件中对应的是“读未提交(
Read Uncommied
)”隔离级别(顾名思义,
即允许读取到未提交事务修改的数据)。该隔离级别最低,并发性最高。
在该隔离级别下,所有的读取操作(例如
select
查询)均不会对相应数据对象加任何
锁,读取前也不检查读取对象是否被上锁。因此,数据对象被修改时,其他事务并不检查
上面是否有
X
锁就直接读,脏读的情况可能会发生。数据在被读取时,由于不上
S
锁,其
他事务能直接上
X
锁并修改,幻读和不可重复读也无法避免。
提交读(
Commied Read
)
在别的数据库软件中称为“读已提交(
Read Commied
)”。该隔离级别并发性较高,是
使用最广泛的一种隔离级别。
在该隔离级别下,读取操作会对数据对象尝试加
S
锁(但不会真正加上
S
锁)来检测
对象是否正被修改。假设数据对象正在被事务
A
修改,对象上会存在
X
锁。此时事务
B
要
读取该对象,会尝试加
S
锁,但由于
X
锁存在,尝试加锁会失败,
B
会进行等待,如果等待
超时则报错退出,从而避免脏读的问题。
如果数据对象上本身无
X
锁,事务
B
仅读取对象而不加
S
锁。因此幻读和不可重复读
的问题无法避免。
最后提交读(
Last Commied Read
)
在该隔离级别下,读取操作不检查数据对象上有没有锁,直接通过逻辑日志读取该数
据对象最后一次提交的值。当然,读取全过程也不上任何锁,因此最后提交读能避免脏读
但不能避免幻读和不可重复读。
相比提交读,最后提交读不检查锁,也不需要锁等待,并发性相对更高。此外,在提
交读下会出现因死锁产生的锁等待情况,但在最后提交读下由于读取不检查锁,可直接避
免此种情况。
游标读(
Cursor Stability
)
游标读基于游标来实现。在该隔离级别下,假设读取时游标检索到某个数据对象
1
,
就会切实地加上
S
锁,当读取完
1
到下一个对象
2
时,对象
1
上的
S
锁会被及时地释放掉。
由于读取操作切实地加上了
S
锁,脏读、幻读、不可重复读均可避免。
评论