曲苑杂坛--DML操作中如何处理那些未提交的数据
对数据库稍有了解的人,数据库使用排他锁X锁来避免两个事务同时修改同一条数据,同时使用较低级别如行上加锁来提高并发度。
以下了两种场景很容易理解:
1>事务1执行 UPDATE TB1 SET C2=1 WHERE C1=1(此处假设C1为主键,使用行锁),事务1未提交,而后事务2执行UPDATE TB1 SET C2=2 WHERE C1=1,事务2必须等到事务1提交或回滚后,才能获得对该行数据的X锁;
2>事务1执行 UPDATE TB1 SET C2=1 WHERE C1=1(此处假设C1为主键,使用行锁),事务1未提交,而后事务2执行UPDATE TB1 SET C2=2 WHERE C1=2,由于事务1和2修改的数据行不同,因此事务1和事务2不会阻塞;
但对于以下两种场景就有些难理解:
1>事务1执行 UPDATE TB1 SET C1=11 WHERE C1=1(此处假设C1为主键,使用行锁),事务1未提交,而后事务2执行UPDATE TB1 SET C2=2 WHERE C1=11,数据行在事务1更新前不满足事务2的更新条件,但数据行在事务1更新后又满足事务2的更新条件,事务2会被事务1阻塞么?
测试结果:会被阻塞
测试代码:

DROP TABLE dbo.TB1 GO CREATE TABLE TB1 ( C1 INT, C2 INT ) GO CREATE UNIQUE CLUSTERED INDEX IDX_C1 ON dbo.TB1 ( C1 ) GO INSERT INTO dbo.TB1( C1, C2 ) SELECT 1,1 UNION SELECT 2,2 UNION SELECT 3,3 UNION SELECT 4,4 GO 事务1开始执行,修改数据行但未提交; BEGIN TRAN UPDATE dbo.TB1 SET C1=11 WHERE C1=1 在新会话中事务2执行 UPDATE TB1 SET C2=2 WHERE C1=11
2>事务1执行 UPDATE TB1 SET C1=11 WHERE C1=1(此处假设C1为主键,使用行锁),事务1未提交,而后事务2执行UPDATE TB1 SET C2=2 WHERE C1=1,数据行在事务1更新前满足事务2的更新条件,但数据行在事务1更新后又不满足事务2的更新条件,事务2会被事务1阻塞么?
测试结果:会被阻塞
测试代码:

DROP TABLE dbo.TB1 GO CREATE TABLE TB1 ( C1 INT, C2 INT ) GO CREATE UNIQUE CLUSTERED INDEX IDX_C1 ON dbo.TB1 ( C1 ) GO INSERT INTO dbo.TB1( C1, C2 ) SELECT 1,1 UNION SELECT 2,2 UNION SELECT 3,3 UNION SELECT 4,4 GO 事务1开始执行,修改数据行但未提交; BEGIN TRAN UPDATE dbo.TB1 SET C1=11 WHERE C1=1 在新会话中事务2执行 UPDATE TB1 SET C2=2 WHERE C1=1
3>事务1执行 INSERT INTO dbo.TB1( C1, C2 )SELECT 5,5(此处假设C1为主键,使用行锁),事务1未提交,而后事务2执行UPDATE TB1 SET C2=2 WHERE C1=5,数据行在事务1更新前满足事务2的更新条件,但数据行在事务1更新后又不满足事务2的更新条件,事务2会被事务1阻塞么?
测试结果:会被阻塞
测试代码:

DROP TABLE dbo.TB1 GO CREATE TABLE TB1 ( C1 INT, C2 INT ) GO CREATE UNIQUE CLUSTERED INDEX IDX_C1 ON dbo.TB1 ( C1 ) GO INSERT INTO dbo.TB1( C1, C2 ) SELECT 1,1 UNION SELECT 2,2 UNION SELECT 3,3 UNION SELECT 4,4 GO 事务1开始执行,修改数据行但未提交; BEGIN TRAN INSERT INTO dbo.TB1( C1, C2 ) SELECT 5,5 在新会话中事务2执行 UPDATE TB1 SET C2=2 WHERE C1=5
测试结论:
对于未提交事务A修改的数据,无论该数据在更新修改的值前还是修改后的值满足事务B的修改条件,那么都会对事务B造成阻塞。
--==========================================================
年关近了,日子不好过,随时担心被母亲大人电话轰炸,压力山大,so,小伙伴们就将就着看着没啥营养的博客吧!
--==========================================================
依旧是妹子
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2014-01-24 执行计划--Adhoc和Prepare