对数据库稍有了解的人,数据库使用排他锁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

View Code

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

View Code

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

View Code

测试结论:

对于未提交事务A修改的数据,无论该数据在更新修改的值前还是修改后的值满足事务B的修改条件,那么都会对事务B造成阻塞。

--==========================================================

年关近了,日子不好过,随时担心被母亲大人电话轰炸,压力山大,so,小伙伴们就将就着看着没啥营养的博客吧!

--==========================================================

依旧是妹子

转载于:https://www.cnblogs.com/TeyGao/p/4246775.html

曲苑杂坛--DML操作中如何处理那些未提交的数据相关推荐

  1. 曲苑杂坛--收缩数据库文件

    很多人在删除大量数据后收缩数据库,却发现没法收缩到预期效果. 由于使用DBCC SHRINKFILE来收缩数据文件时,是针对数据区来收缩,因此可以先使用DBCC SHOWFILESTATS来查看文件中 ...

  2. 曲苑杂坛--修改数据库名和文件组名

    /* 该脚本示例如何完整的修改一个数据库的名称. 数据库为原名称为DB_BEIJING,需要修改成DB_SHANGHAI nzperfect 2012.12.19 */--判断是否存在同名的数据库,以 ...

  3. 【c苑杂坛之小游戏系列】 三子棋游戏

    [c苑杂坛之边学边玩] 三子棋游戏带你初识C语言 1.游戏说明 2.效果展示 3.游戏代码 1.游戏说明 三子棋游戏相信大家都知道,在这里不去讲述游戏背景,对本代码实现的三子棋游戏进行一定的说明. 博 ...

  4. 检查点(Checkpoint)过程如何处理未提交的事务

    每次我讲解SQL Server之前,我都会先简单谈下当我们执行查询时,在SQL Server内部发生了什么.执行一个SELECT语句非常简单,但是执行DML语句更加复杂,因为SQL Server要修改 ...

  5. 前端如何处理十万级别的大量数据

    给 「前端开发博客」 加星标,每天打卡学习 长按二维码即可识别"进入网页"查看哟~ 1.前端如何处理十万级别的大量数据 写博客主要是用来总结.巩固知识点,加深自己对这个知识点的理解 ...

  6. [曲苑杂谈]mac\windows phpstorm快捷键

    下载链接:https://www.jetbrains.com/phpstorm/documentation/PhpStorm_ReferenceCard.pdf

  7. 抄袭、模仿、借鉴、创新,曲苑杂谈。

    你能分清这四个词吗?我试着先从最小的地方来说说看. 抄袭与模仿 之所以放到一起,因为这是最难划分的一对,最难判断的一对,而更重要的是抄袭是贬义是恶劣的行为,而模仿是中性.或者说抄袭是绝对的反面可以无情 ...

  8. 如何处理几十万条并发数据_Swoole 如何处理高并发以及异步 I/O 的实现

    Swoole 介绍 1.swoole提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis, 数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件 ...

  9. Flink应如何处理窗口中迟到的数据?

    一.如何处理迟到的数据 三个步骤: .1 设置水位线延迟时间 因为水位线的延迟主要是用来对付分布式网络传输导致的数据乱序,而网络传输的乱序程度一般并不会很大,大多集中在几毫秒至几百毫秒.所以实际应用中 ...

  10. 如何处理几十万条并发数据?

    用存储过程或事务.取得最大标识的时候同时更新.注意主键不是自增量方式这种方法并发的时候是不会有重复主键的,取得最大标识要有一个存储过程来获取. 转载于:https://www.cnblogs.com/ ...

最新文章

  1. 关于“INS-40922 Invalid Scan Name – Unresolvable to IP address”
  2. SQL语句利用日志写shell
  3. C语言循环队列的实现方法,C语言循环队列(数组实现)
  4. java 远程debug 内网_java jdb remote debug - java远程调试
  5. python docker自动化_「docker实战篇」python的docker爬虫技术-移动自动化控制工具安卓ADB的使用(15)...
  6. CLin 和 IDEA创建文件时自动添加作者和时间信息 + 多个.cpp文件在CLion下运行问题...
  7. 【排序】内部排序算法实现
  8. Harmony OS — TabList和Tab分页栏
  9. leetcode刷题日记- 超级次方
  10. 通俗地讲解傅立叶分析和小波分析间的关系
  11. 小米机器如何无root激活XPOSED框架的流程
  12. Python爬虫实战——Quora网站文字自动化爬取和正则匹配筛选信息
  13. 美国enom域名的优势
  14. JavaEE中的依赖性——依赖性注入
  15. Linux修改只读文件(Read-Only)的方法
  16. 2022基金从业人员资格管理及后续职业培训 部分答案(自答)
  17. google的秘密入口+搜索技巧
  18. 上一页 1 2 3 ... 10 下一页 固定分页
  19. 昨天学了js的控制css样式,自己做了个算卦小程序
  20. 电源模块设计过程(降压、正压转负压)-MC34063

热门文章

  1. 应用泛函分析—距离空间
  2. 80004005错误代码_0x80004005,手把手教你解决0x80004005错误代码的方法
  3. xml文件中SQL语句的大于号、小于号、等于号的转义问题
  4. eas bos根据合同类别过滤自定义核算项目
  5. 微信公众账号开发教程(二) 基础框架搭建——转自http://www.cnblogs.com/yank/p/3392394.html...
  6. R语言中交集,并集,补集,差集的方法:向量和数据框
  7. SpringBoot+redis时事务和SessionCallback的使用和抉择
  8. Excel中行数据转换为Java对象
  9. 使用UltraISO制作U盘系统启动盘图文教程
  10. python有几级等级考试成绩查询_python查询46级成绩