Db2中Read Uncommitted隔离级别下并发UPDATE与SELECT的原子性问题
Db2中UPDATE原子性与Read Uncommitted隔离级的并发查询问题
场景说明
现有表TABLE_A的结构及初始数据:
| id | columnA | columnB |
|---|---|---|
| 1 | oldValueA | oldValueB |
同时执行以下两个查询:
- Query #1(更新语句):
UPDATE TABLE_A SET columnA = 'newValueA', columnB = 'newValueB' WHERE id = 1;
- Query #2(读未提交级别的查询):
SELECT columnA, columnB FROM TABLE_A WHERE id = 1 WITH UR;
问题解答
核心结论
在Db2中,Query #2不可能返回单行内的新旧混合值(如newValueA, oldValueB)。
具体解析
Db2单行UPDATE的原子性
Db2对单行的UPDATE操作是原子性执行的:要么所有指定列的修改全部完成,要么整个更新操作回退到初始状态。Db2会先锁定目标行,然后一次性完成所有列的修改,不存在逐列分步执行的情况。Read Uncommitted(WITH UR)的读取逻辑
虽然WITH UR允许读取未提交的修改,但它只能读取Db2已经完成的状态。对于单行UPDATE来说,只有当所有列的修改都完成后,其他会话的WITH UR查询才能看到更新后的完整行;如果UPDATE操作还未完成,查询看到的就是更新前的完整行,不会出现半更新的不一致状态。数据库差异补充
确实,不同数据库的实现逻辑可能存在差异,但针对Db2,单行UPDATE的原子性是内置机制,不受隔离级影响,WITH UR查询无法获取到单行内的不一致列值。
内容的提问来源于stack exchange,提问作者michalte97
相关产品推荐
相关产品推荐

