如何在DB2交互式SQL中设置Read Stability等隔离级别并执行命令?
DB2隔离级别手动测试的正确操作方法
核心问题纠正
你遇到的报错有两个原因:
- DB2不支持
RC这个隔离级别,DB2的标准隔离级别为**UR(未提交读)、CS(游标稳定)、RS(读稳定)、RR(可重复读)**四类,没有RC对应的级别。 CHANGE ISOLATION不是DB2命令行处理器(CLP)的有效命令,正确的隔离级别设置方式有两种,适合手动会话操作的如下:
前提准备
所有测试会话都需要关闭自动提交(才能手动控制事务生命周期),并连接到目标数据库:
# 进入DB2交互模式并关闭自动提交 db2 +c # 连接SAMPLE数据库 db2 => connect to sample # 可验证自动提交状态(可选) db2 => get command options | grep AUTOCOMMIT
方法1:为单个事务设置隔离级别
该方式仅对当前事务生效,事务结束(COMMIT/ROLLBACK)后恢复默认级别:
- 设置Read Stability(RS):
db2 => SET TRANSACTION ISOLATION LEVEL READ STABILITY; - 其他隔离级别对应语句:
- RR(可重复读):
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; - CS(游标稳定):
SET TRANSACTION ISOLATION LEVEL CURSOR STABILITY; - UR(未提交读):
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
- RR(可重复读):
执行完隔离级别设置后,即可执行查询、更新等操作,直到执行COMMIT或ROLLBACK结束当前事务。
方法2:为当前会话设置默认隔离级别
该方式会让当前会话的所有后续事务都使用指定级别,直到会话结束:
- 设置Read Stability(RS):
db2 => SET ISOLATION RS; - 其他隔离级别缩写:
- RR:可重复读
- CS:游标稳定
- UR:未提交读
RS隔离级别测试示例(双会话)
会话1操作:
- 进入交互模式并连接数据库(已关闭自动提交)
- 设置RS隔离级别并执行查询:
SET TRANSACTION ISOLATION LEVEL READ STABILITY; SELECT * FROM EMP WHERE DEPTNO = '10'; - 保持会话打开,不要执行COMMIT/ROLLBACK
会话2操作:
- 同样进入交互模式并连接数据库(关闭自动提交)
- 尝试更新会话1查询过的行:
此时会话2会被阻塞——RS隔离级别下,会话1的查询会对符合条件的所有行加共享锁,阻止其他事务修改这些行。UPDATE EMP SET SALARY = SALARY * 1.1 WHERE DEPTNO = '10';
回到会话1:
执行COMMIT;提交事务,此时会话2的UPDATE操作会立即执行完成,即可观察到RS隔离级别的锁行为。
内容的提问来源于stack exchange,提问作者Paul A Jungwirth
相关产品推荐
相关产品推荐

