DB2隔离级别之RR/RS/CS/UR
程序员文章站
2022-03-31 10:19:40
...
1.RR隔离级别:在此隔离级别下, DB2会锁住所有相关的纪录。 在一个SQL语句执行期间, 所有执行此语句扫描过的纪录都会被加上相应的锁。在一个SQL语句执行期间,所有执行此语句扫描过的纪录都会被加上相应的锁。 具体的锁的类型还是由操作的类型来决定, 如果
1.RR隔离级别:在此隔离级别下, DB2会锁住所有相关的纪录。 在一个SQL语句执行期间, 所有执行此语句扫描过的纪录都会被加上相应的锁。在一个SQL语句执行期间,所有执行此语句扫描过的纪录都会被加上相应的锁。 具体的锁的类型还是由操作的类型来决定, 如果是读取,则加共享锁; 如果是更新, 则加独占锁。具体的锁的类型还是由操作的类型来决定,如果是读取,则加共享锁;如果是更新,则加独占锁。 由于会锁定所有为获得SQL语句的结果而扫描的纪录, 所以锁的数量可能会很庞大, 这个时候, 索引的增加可能会对SQL语句的执行有很大的影响,因为索引会影响SQL语句扫描的纪录数量。由於会锁定所有為获得SQL语句的结果而扫描的纪录,所以锁 的数量可能会很庞大,这个时候,索引的增加可能会对SQL语句的执行有很大的影响,因為索引会影响SQL语句扫描的纪录数量。2.RS隔离级别:此隔离级别的要求比RR隔离级别稍弱,此隔离级别下会锁定所有符合条件的纪录。 不论是读取, 还是更新, 如果SQL语句中包含查询条件, 则会对所有符合条件的纪录加相应的锁。不论是读取,还是更新,如果SQL语句中包含查询条件,则会对所有符合条件的纪录加相应的锁。 如果没有条件语句, 也就是对表中的所有记录进行处理,则会对所有的纪录加锁。如果没有条件语句,也就是对錶中的所有记录进行处理,则会对所有的纪录加锁。
3.CS隔离级别:此隔离级别仅锁住当前处理的纪录。
4.UR隔离级别:此隔离级别下,如果是读取操作,不会出现任何的行级锁。 对于非只读的操作,它的锁处理和CS相同。对於非只读的操作,它的锁处理和CS相同。
DB2默认的隔离级别是CS。 DB2默认的隔离级别是CS。 即游标稳定性。即游标稳定性。
在DB2中,共有四种隔离级:RS,RR,CS,UR
eg:db2 select * from topicis.dm_qylx with ur
UR:UR-Uncommitted Read 未提交读
是sql执行时的一种隔离级别,允许脏读,不加行锁
不带with UR的话,select count(1) 常见的是S锁! update 应该是X锁;应该会发生等待!
带上with ur,select count(1) 应该是IN锁, update 是x锁;刚好不会等待!
刚刚测试了下
C:\>db2 create table a(a int)
DB20000I SQL命令成功完成。
C:\>db2 insert into a values(1)
DB20000I SQL命令成功完成。
C:\>db2 commit
DB20000I SQL命令成功完成。
C:\>db2 +c select count(*) from a
1
-----------
1
1 条记录已选择。
这个时候的 lock 的情况是
C:\>db2pd -d test -lock
Database Partition 0 -- Database TEST -- Active -- Up 0 days 00:20:49
Locks:
Address TranHdl Lockname Type Mode Sts Owner
Dur HoldCount Att ReleaseFlg
0x05190450 2 53514C4332463041F12CF8E241 Internal P ..S G 2
1 0 0x00 0x40000000
在另外一个 db2cmd 中
C:\>db2 +c update a set a=2
DB20000I SQL命令成功完成。
这时的 lock 情况如下
C:\>db2pd -d test -lock
Database Partition 0 -- Database TEST -- Active -- Up 0 days 00:21:03
Locks:
Address TranHdl Lockname Type Mode Sts Owner
Dur HoldCount Att ReleaseFlg
0x051911E0 6 05000F00040000050000000052 Row ..X G 6
1 0 0x00 0x40000000
0x05190450 2 53514C4332463041F12CF8E241 Internal P ..S G 2
1 0 0x00 0x40000000
0x05190300 6 53514C4332463041F12CF8E241 Internal P ..S G 6
1 0 0x00 0x40000000
0x051911B0 6 05000F00000000000000000054 Table .IX G 6
1 0 0x00 0x40000000
__________________
The More You Know The More You're Worth
http://macrozeng.itpub.net
macrozeng#itpub.net
同样的测试加上 for read only with ur
C:\>db2 commit
DB20000I SQL命令成功完成。
C:\>db2 +c select count(*) from a for read only with ur
1
-----------
1
1 条记录已选择。
这时的 lock 情况如下
C:\>db2pd -d test -lock
Database Partition 0 -- Database TEST -- Active -- Up 0 days 00:27:56
Locks:
Address TranHdl Lockname Type Mode Sts Owner
Dur HoldCount Att ReleaseFlg
0x05191B70 2 53514C4332463041F12CF8E241 Internal P ..S G 2
1 0 0x00 0x40000000
在另外一个 db2cmd 中
C:\>db2 +c update a set a=2
DB20000I SQL命令成功完成。
这时的 lock 情况如下
C:\>db2pd -d test -lock
Database Partition 0 -- Database TEST -- Active -- Up 0 days 00:28:23
Locks:
Address TranHdl Lockname Type Mode Sts Owner
Dur HoldCount Att ReleaseFlg
0x05190330 6 05000F00040000050000000052 Row ..X G 6
1 0 0x00 0x40000000
0x05191B70 2 53514C4332463041F12CF8E241 Internal P ..S G 2
1 0 0x00 0x40000000
0x05190570 6 53514C4332463041F12CF8E241 Internal P ..S G 6
1 0 0x00 0x40000000
0x05191240 6 05000F00000000000000000054 Table .IX G 6
1 0 0x00 0x40000000
小结:
1、ur(Uncommited Read):就是俗称“脏读“,在没有提交数据的时候能够读到更新的数据;即select数据时,无需等待正在对数据进行的update操作。
2、cs(Cursor Stability):在使用游标稳定性隔离级别时,一个事务的结果集中只有正在被读取的那一行(游标指向的行)会被加上NS锁,其他未被处理的行上不被加锁。这种隔离级别只能保证正在被处理的行的值不会被其他并发的程序所改变。该隔离级别是DB2默认的隔离级别。可以避免脏读的发生,但无法避免不可重复读和幻读的情况发生。
3、rs(Read Stability):在一个事务中进行查询时,不允许读取其他事务update结果集中的数据,允许读取到其他事务提交的新增数据。会锁定结果集中的所有行,会解决不可重复读问题,但无法解决幻读的问题。
4、rr(Repeatable Read):在一个事务中进行查询时,不允许任何对这个查询表的数据修改。对该表的操作彻底为序列化的形式,效率最低,可避免任何问题。
上一篇: 数据库后台优化触发器