环境: sqlserver 2008

 

事务(进程 ID (n))与另一个进程被死锁在锁资源上,并且已被选作死锁牺牲品。请重新运行

 

死锁原理:

如两个任务

任务1,已经锁定R1,再进行请求R2<R2此时被任务2锁定>

任务2,已经锁定R2,再进行请求R1<R1此时被任务1锁定>

导致两个任务都进入了阻塞。SQLSERVER会选择一个进行牺牲。

 

了解了原理后,来段SQL

-- 表结构和模拟数据
CREATE TABLE R1(
ID INT NOT NULL,
Name varchar(50) NULL,
Num INT NULL
CONSTRAINT [PK_R1] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
) ON [PRIMARY] GO INSERT INTO R1(ID, Name, Num) VALUES(1, '张三', 50)
INSERT INTO R1(ID, Name, Num) VALUES(2, '李四', 50) CREATE TABLE R2(
ID INT NOT NULL,
Name varchar(50) NULL,
Num INT NULL
CONSTRAINT [PK_R2] PRIMARY KEY CLUSTERED
(
[ID] ASC
)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON)
ON [PRIMARY]
) ON [PRIMARY] GO INSERT INTO R2(ID, Name, Num) VALUES(1, '张三', 50)
INSERT INTO R2(ID, Name, Num) VALUES(2, '李四', 50)

 

任务1:

begin tran t1

-- R1
update R1 SET Num = 91 WHERE Name = '张三' -- R2
update R2 SET Num = 91 WHERE Name = '李四' rollback tran t1

 

任务2:

begin tran t2

-- R2
update R2 SET Num = 91 WHERE Name = '李四' -- R1
update R1 SET Num = 91 WHERE Name = '张三' rollback tran t2

 

执行方法:

1.在任务1里面执行前两句(开启事务, 锁定R1)

2.然后切换到任务2里面执行前两句(开启事务, 锁定R2)

3.在任务1里面执行锁定R2(update R2…)此时要请求的R2被任务2锁定

4.在任务2里面执行锁定R1(Update R1…)此时请求的R1被任务1锁定。

进入了死锁,然后会弹出死锁的信息。

消息 1205,级别 13,状态 51,第 2 行

事务(进程 ID 89)与另一个进程被死锁在 锁 资源上,并且已被选作死锁牺牲品。请重新运行该事务。

模拟 SQLSERVER 死锁的更多相关文章

  1. 面试官:请用SQL模拟一个死锁

    文章首发于公众号:BiggerBoy 有读者说面试被问到怎么用SQL模拟数据库死锁? 这位读者表示对Java中的死锁还是略知一二的,但是突然用SQL写死锁的案例之前还真没遇到过,这个问题没答上来.所以 ...

  2. 一次查找sqlserver死锁的经历

    查找bug是程序员的家常便饭,我身边的人喜欢让用户来重现问题.当然他们也会从正式服务器上下载错误log,然后尝试分析log,不过当错误不是那种不经思考就可识别的情况,他们就会将问题推向用户,甚至怪罪程 ...

  3. sqlserver 死锁原因及解决方法

    其实所有的死锁最深层的原因就是一个:资源竞争 表现一: 一个用户A 访问表A(锁住了表A),然后又访问表B,另一个用户B 访问表B(锁住了表B),然后企图访问表A,这时用户A由于用户B已经锁住表B,它 ...

  4. SqlServer死锁与阻塞检测脚本

    IF EXISTS (SELECT * FROM sysobjects WHERE [name] = 'sp_Lock_Scan') DROP PROCEDURE sp_Lock_Scan GO CR ...

  5. sqlserver 死锁查看辅助存储过程

    USE [master] GO /****** Object: StoredProcedure [dbo].[sp_who_lock] Script Date: 03/23/2016 14:17:49 ...

  6. 查找 SqlServer死锁

    use master if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_who_lock]') ) dr ...

  7. SQLSERVER 死锁标志

    最开始做DBA的时候,整天死锁到头痛1222,至今都能回想到这个错误窗口: 死锁定义:死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待 ...

  8. 验证SQLServer死锁进程

    SELECT '现在没有阻塞和死锁信息' AS message -- 循环开始WHILE @intCounter <= @intCountProperties BEGIN-- 取第一条记录 SE ...

  9. sqlserver 死锁相关

    参考 https://www.cnblogs.com/fuyuanming/p/5783421.html -- 查询死锁 select request_session_id spid, OBJECT_ ...

随机推荐

  1. java代码行数计算器

        import java.io.BufferedReader; import java.io.File; import java.io.FileReader; import java.util. ...

  2. 【RS】Modeling User Exposure in Recommendation - 在推荐中建模用户的暴露程度

    [论文标题]Modeling User Exposure in Recommendation (2016-WWW) [论文作者]Dawen Liang,Laurent Charlin,James Mc ...

  3. Ubuntu下看不见pthread_create(安装pthread线程库)

    使用下面的命令就可以了! sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev 然后在用man -k pthre ...

  4. HDU 3820 Golden Eggs (SAP | Dinic)

    Golden Eggs Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. Event事件的兼容性(转)

    window.event问题问题说明:window.event 只能在IE下运行,而不能在Firefox下运行,这是因为Firefox的event只能在事件发生的现场使用.解决方法:在事件发生的函数上 ...

  6. java 高性能读模式(译)

    原文地址:http://tutorials.jenkov.com/java-performance/read-patterns.html 好久没翻译了,逛知乎,无意间发现的一个链接,写的太好了,而且内 ...

  7. php mysql procedure获取多个结果集

    protected function getRs($id) { $db = new mysqli(C("DB_HOST"), C("DB_USER"), C(& ...

  8. 更改jdk后,eclipse运行jsp出错

    1.错误: 在Eclipse下启动tomcat的时候,报错为:Eclipse下启动tomcat报错:The archive: C:/Program Files(x86)/Java/jdk1.7.0_1 ...

  9. golang学习 ----获取URL

    package main import ( "fmt" "io/ioutil" "net/http" "os" ) fu ...

  10. ERROR: No query specified

    mysql中执行show命令的时候,提示以下信息: mysql> show variables like 'datadir'\G; *************************** 1. ...