对数据库稍有了解的人,数据库使用排他锁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,小伙伴们就将就着看着没啥营养的博客吧!

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

依旧是妹子

曲苑杂坛--DML操作中如何处理那些未提交的数据的更多相关文章

  1. 曲苑杂坛--查看CPU配置

    ​--===================================================--查看CPU配置SELECT cpu_count AS [Logical CPU Coun ...

  2. 曲演杂坛--一条DELETE引发的思考

    原文:曲演杂坛--一条DELETE引发的思考 场景介绍: 我们有一张表,专门用来生成自增ID供业务使用,表结构如下: CREATE TABLE TB001 ( ID ,) PRIMARY KEY, D ...

  3. 曲演杂坛--使用TRY CATCH应该注意的一个小细节

    群里一个朋友遇到一个TRY CATCH的小问题,测试后发现是自己从来没有考虑的情况,写篇blog加深下印象 --============================================ ...

  4. 曲演杂坛--重建索引后,还使用混合分区么?(Are mixed pages removed by an index rebuild?)

    原文来自:http://www.sqlskills.com/blogs/paul/mixed-pages-removed-index-rebuild/ 在SQL SERVER 中,区是管理空间的基本单 ...

  5. 曲演杂坛--蛋疼的ROW_NUMBER函数

    使用ROW_NUMBER来分页几乎是家喻户晓的东东了,而且这东西简单易用,简直就是程序员居家必备之杀器,然而ROW_NUMBER也不是一招吃遍天下鲜的无敌BUG般存在,最近就遇到几个小问题,拿出来供大 ...

  6. 曲演杂坛--当ROW_NUMBER遇到TOP

    值班期间研发同事打来电话,说应用有超时,上服务器上检查发现有SQL大批量地执行,该SQL消耗IO资源较多,导致服务器存在IO瓶颈,细看SQL,发现自己都被整蒙了,不知道这SQL是要干啥,处理完问题赶紧 ...

  7. 曲演杂坛--特殊字符/生僻字与varchar

    对于中文版的SQL SERVER,默认安装后使用的默认排序规则为Chinese_PRC_CI_AS,在此排序规则下,使用varchar类型来可以“正常存取”存放中文字符以及一些东南亚国家的字符,同时v ...

  8. 曲演杂坛--使用CTE时踩的小坑:No Join Predicate

    在一次系统优化中,意外发现一个比较“坑”的SQL,拿出来供大家分享. 生成演示数据: --====================================== --检查测试表是否存在 IF(O ...

  9. 曲演杂坛--为什么SELECT语句会被其他SELECT阻塞?

    很多刚入门的DBA在捕获阻塞得时候,会问这么一个问题“为什么这个SELECT语句被那个SELECT语句阻塞了,难道不是共享锁么?” 让我们来做个小测试,首先准备一些测试数据: --========== ...

随机推荐

  1. 20180613更新 leetcode刷题

    最近就是忙工作项目 工作间隙就刷了刷LEETCODE 所以没啥更新 // 1111111.cpp: 定义控制台应用程序的入口点. // #include "stdafx.h" #i ...

  2. jquery plugin 之 form表单验证插件

    基于h5表单验证系统.扩展了对easyui组件的支持 先上图: 提示样式用到了伪对象的 {content: attr(xxx)}函数方法,实现提示信息能动态切换. 1.关键属性说明: type: 表单 ...

  3. 编译sgbm_ros中遇到的问题

    出现的问题 这个会报错 1.解决方法是在文件sudo gedit /usr/local/cuda/include/crt/common_functions.h中注释掉如下 #define __CUDA ...

  4. maven打包之后为什么class文件中没有注释了?

    <!--生成doc jar包--> <plugin> <groupId>org.apache.maven.plugins</groupId> <a ...

  5. Spark学习笔记-GraphX-1

    Spark学习笔记-GraphX-1 标签: SparkGraphGraphX图计算 2014-09-29 13:04 2339人阅读 评论(0) 收藏 举报  分类: Spark(8)  版权声明: ...

  6. CSS-尺寸与边框

    1.基础选择器的优先级 权值:标识当前选择器的重要程度,权值越大优先级越高. 元素选择器 1 类选择器 10 伪类选择器 10 ID选择器 100 内联样式 1000 选择器的权值加到一起,大的优先 ...

  7. static与非static的区别

    static 静态的,可以修饰变量或者方法 用于变量的区别 1. static 修饰的变量称为类变量或全局变量或成员变量,在类被加载的时候成员变量即被初始化,与类关联,只要类存在,static变量就存 ...

  8. 算法工程师A

    美团点评2017校招笔试真题-算法工程师A   美团点评2017校招笔试真题-算法工程师A 1.下面哪种STL容器的实现和其它三个不一样 A. set B. deque C. multimap D. ...

  9. 2019.01.23 hdu3377 Plan(轮廓线dp)

    传送门 题意简述:给一个n*m的带权矩阵,求从左上角走到右下角的最大分数,每个格子只能经过最多一次,n,m≤9n,m\le9n,m≤9. 思路: 考虑轮廓线dpdpdp,但这道题并没有出现回路的限制因 ...

  10. 2018.10.25 bzo1227: [SDOI2009]虔诚的墓主人(组合数学+扫描线+bit)

    传送门 有点难调啊.其实是我自己sb了 不过交上去1A1A1A还是平衡了一下心态. 所以这道题怎么做呢? 我们考虑对于一个点(x,y)(x,y)(x,y)如果这个点成为中心,正左/右/上/下分别有l/ ...