首页 » DB » 正文

DB2锁、隔离级别、事务的深入理解

之前总结了一下DB2锁、隔离界别、事务的相关主题,但是,在后续的研发过程中,发现还是没有理解到位,现在对DB2再做个更深入的总结。

之前的文章:
http://cloudate.net/?p=2250

查看隔离级别:
db2
connect to robert
values current isolation

显示空的,说明是默认的,现在默认是Currently Stability。

修改隔离级别:
set current isolation ur

db2关闭命令行CLP自动提交

临时:
update command options using C off –临时关闭自动提交
update command options using C on –临时开启自动提交

永远:
db2set -lr | grep DB2OPTION
db2set DB2OPTIONS=+c

设置事务跳过插入和删除:
db2set DB2_SKIPINSERTED=ON -i
db2set DB2_SKIPDELETED=ON -i
db2stop force
db2start

查询事务跳过插入和删除:
db2set | grep SKIP

做的测试如下:

前提条件:隔离级别没有特别设置,显示为空,session都关闭自动提交,db2_skipinsert和db2_skipdeleted都未设置
测试结果:
1. 插入未提交的数据,另外一个事务不能查到插入记录,并不阻塞
2. 更新未提交的数据,另外一个事务不能查到更新后的字段值,并不阻塞
3. 删除未提交的数据,另外一个事务仍然能查到删除的记录,并不阻塞
4. 更新与其他事务的删除互斥,其他事务阻塞
5. 更新与其他事务的更新互斥,其他事务阻塞

根据上面的测试结果,可见这种情况完全符合MVCC的模型。

接下来做了另外一个测试,开启了db2_skipinsert和db2_skipdeleted,结果如上面完全相同,这两个参数就像没有起到任何作用一样。

总结:

原来以为db2使用的是悲观锁来实现的,原以为db2_skipinsert和db2_skipdeleted未开启的时候,删除与查询会阻塞,而开启的时候,其他事务应该能看到其他事务未提交的插入和删除的数据的效果,可是完全不是这样的。

结果是,不管开启db2_skipinsert和db2_skipdeleted,都是和MVCC的模型达成的效果是一样的,应该是db2在新版本中隔离级别默认为Currently Stability,他区别于ur、cs、rs、rr等级别,与oracle和mysql的mvcc实现的效果是一致的,也就是db2也实现了mvcc。