GBase 8t在锁方面是如何实现???
发布网友
发布时间:2022-04-24 15:16
我来回答
共1个回答
热心网友
时间:2022-04-13 06:57
锁的产生是因为并发访问控制,先访问数据的会话对其加锁,以防止后面访问的会话对其修改,造成数据异常。GBase 8t的锁分为下面几种:
a.共享锁;
b.排他锁;
c.更新锁 (lock-U)在更新Cursor中使用更新锁由cursors 含有‘for update’ 选项执行时产生的,只能在没有排他锁或者更新锁的记录上加更新锁当锁定的记录真正执行的时候,更新锁将提升为排他锁;
d.专一锁 (lock-IX or IS) 自动分配, 如果一条记录上的记录被更新,一个排他锁将分配在该记录上,同时将该记录的表上自动加上专一锁,这能保证没有session可以在该表上增加排他锁,只要该表中有记录被增加了排他锁。
锁的粒度有entire databases 数据库锁、entire tables 表锁、disk pages 数据页锁和single rows, or index-key values 行锁四种。锁是与隔离级别相互配合的。GBase 8t事务隔离级别分为下面几种: Dirty Read 、Committed Read 、Cursor Stability、 Repeatable Read 、Last Committed Read;
a.对于Dirty Read隔离级别,数据库服务器不会分配任何锁,查询过程中,可以查询到任何数据row, 甚至那些被修改但尚未提交的记录,因此会产生读取脏数据的情况。该隔离级别的并发访问程度最高。
b.对于Committed Read隔离级别,是数据库默认的隔离级别,能避免读到脏数据,读到的所有的记录都是已提交的。
c.对于Cursor Stability隔离级别,不仅可以看到提交的记录,也可以保证看到的记录不会被更新,其他进程不能更新 (UPDATE or DELETE) 你所看到的记录,当移动到下一行时,锁才会释放,记录就可以进行修改。这种隔离级别可以解决幻影读的问题。
d.对于Repeatable Read隔离级别,数据库在读取的记录上加共享锁,验证是否可以读取数据直到事务提交,锁才能释放其他用户可以读取数据,但是不能修改。这种隔离级别是隔离程度最高的,能够解决不可重复读和幻影读的问题。
e.对于Last Committed Read隔离级别,当所读的记录被锁,读取的是记录最后一次提交的数据;这种隔离级别类似oracle的读一致性。