oracle锁深入

  oracle对于insert,update,delete的操作时会加一个排它锁与 TM锁。

  这里的排它锁主要是防止,其它session修改当前的行。TM则是防止  其它session修改表结构,如drop table等操作。

  oracle锁实现主要有两种:队列锁与闩。前者就是对于insert,update,delete这些操作时加的排它锁都用这种实现。后者是保护oracle内部的共享内存资源(如果存放sql执行计划结果的内存区域)。

 oracle对于insert,如果当前表对当前列ID加了一个unique约束。这时oracle要保证,表中的ID是唯一的,具体实现如下:

 1. session1,要插入一行ID为1的行。oracle将这个ID进行散列,最后映射到,共享内存中的散列表(假设大小为10000)中的X,这个散列表中每个块代表一个锁。

    这时session1获取到了x处的锁,事务此时未提交。

  2.session2,也插入一行ID为1的行,与前面一样,发现散列表中X处的锁已经被其它事务获取了,因此阻塞等待。

  3.接着session1提交了事务,session2因此开始活动,提交时,发现已经存在该ID为1的行。这时抛出一个主键已存在异常。


 oracle对于update这样的操作,则是,在行所在的数据块上记录相应行是否被其它session锁定。也就是说数据块中会预留一部分空间记录相应行的锁信息(可配置)。

 

 oracle事务的隔离级别主要有read_commit(读已提交), repeat_read(可重复读),seriable(串行化)

 oracle不存在read_uncommit的事务隔离级别,因为oracle为了保证读一致性,底层是通过从undo块中创建当前行的一个副本(拥有相应版本号)来保证。所有的读都会读取这个副本。

 这样也就不存在脏读情况。

 

 

你可能感兴趣的:(oracle锁深入)