DB2学习笔记
锁
表锁:
| 名称缩写 | 全名 | 描述 |
|---|---|---|
| IN | 无意图锁(Intent Node),不需要行锁 | 拥有者可以读取包括其他事务未提交数据在内的所有数据,但不能对表中的数据作出修改 |
| IS | 意图共享锁(Intent Share),需要行锁配合 | 拥有者可以在拥有相应行上的S锁时可以读取该行的数据,但不能修改数据 |
| IX | 意图排他锁(Intent eXclusive),需要行锁配合 | 拥有者可以在拥有相应行上的X锁时可以修改该行的数据 |
| SIX | 共享并且意图排他锁(Share with Intent eXclusive),需要行锁配合 | 拥有者可以读取表中的任何数据,如果在相应的行上可以获得X锁,可以修改该行。SIX的获取比较特殊,当程序拥有IX锁时请求S锁,或者在已经拥有S锁的时候请求IX锁时产生 |
| S | 共享锁(Share),不需要行锁配合 | 可以读取表上的任何数据,如果表上被加了S锁,表上的数据只能被读取而不能做出任何修改 |
| U | 更新锁(Update),不需要行锁配合 | 拥有者可以读取表中的任何数据,如果升级为X锁,则可以更改表中的任何数据,该锁是等待对数据进行修改的一种中间状态 |
| X | 排他锁(eXclusive),不需要行锁配合 | 拥有者可以读取或者修改表中的任意数据,如果加上了X锁,除了未提交读事务外,其他程序都不能对表进行任何读取或者修改 |
| Z | 超级排他锁(Super eXclusive),不需要行锁配合 | 该锁一般不是由 DML 产生,而是由Drop,Alter或者创建删除索引时产生的,加上Z锁后,所有程序(包括未提交读程序)都不能对表进行读取或者修改 |
行锁:
| 名称缩写 | 全名 | 需要表锁最低级别 | 描述 |
|---|---|---|---|
| S | 共享锁(Share) | IS | 该行正在被读取,其他程序只能执行读操作 |
| U | 更改锁(Update) | IX | 某个程序正在读取并有可能修改该行,其他程序只能读取该行 |
| X | 排他锁(eXclusive) | IX | 该行正在被某个程序修改,其他程序不能访问该行 |
| W | 弱排他锁(Weak eXclusive) | IX | 一行被插入表后,该行会加上 W 锁,只有锁的拥有者可以修改该行,与 X 锁的不同在于该锁与 NW 锁兼容 |
| NS | 下一键共享锁(Next Share) | IS | 拥有者与其他程序都可以读取该行,但不能进行修改,当程序处于RS或者CS隔离级别下时,该锁可以代替S锁 |
| NX | 下一键排他锁(NexteXclusive) | IX | 一行的数据被插入到索引或者从索引被删除时,该行的下一行会被加上 NX 锁,锁的拥有者可以读该行的数据但不能修改。该锁与 X 锁类似,但与 NS 锁兼容 |
| NW | 下一键弱排他锁(NextWeak eXclusive) | IX | 一行的数据被插入到索引时,该行的下一行会被加上NW锁,锁的拥有者可以读但不能修改该行的数据,与X锁及 NX 锁类似,但与W锁以及 NS 锁兼容 |
隔离级别
默认隔离级别是CS. DB2的隔离级别有四种:
- RR(Repeatable read), 一般情况下,对整张表加共享锁,其他事务只能读取,不能修改表中的所有的记录。由此可见,不会出现幻读的现象。
- RS(Read stability), 在某个事务中用相同条件查询多次,会得到不一样的结果。对表加意图共享锁,对操作的行加下一键共享锁,只允许其他事务读取这些行,不可以修改。可以插入新的行。在一个事务中,不管是查询到的记录还是更新的记录,都会加锁。会出现幻读现象,但不会出现“不可重复读”。
- CS(Cursor stability), 只会给要更新的记录加锁。对所有结果行加更新锁。
- UR(Uncommitted read), 允许事务读到的记录被其他事务修改。