模拟 SQLSERVER 死锁
环境: 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 死锁的更多相关文章
- 面试官:请用SQL模拟一个死锁
文章首发于公众号:BiggerBoy 有读者说面试被问到怎么用SQL模拟数据库死锁? 这位读者表示对Java中的死锁还是略知一二的,但是突然用SQL写死锁的案例之前还真没遇到过,这个问题没答上来.所以 ...
- 一次查找sqlserver死锁的经历
查找bug是程序员的家常便饭,我身边的人喜欢让用户来重现问题.当然他们也会从正式服务器上下载错误log,然后尝试分析log,不过当错误不是那种不经思考就可识别的情况,他们就会将问题推向用户,甚至怪罪程 ...
- sqlserver 死锁原因及解决方法
其实所有的死锁最深层的原因就是一个:资源竞争 表现一: 一个用户A 访问表A(锁住了表A),然后又访问表B,另一个用户B 访问表B(锁住了表B),然后企图访问表A,这时用户A由于用户B已经锁住表B,它 ...
- SqlServer死锁与阻塞检测脚本
IF EXISTS (SELECT * FROM sysobjects WHERE [name] = 'sp_Lock_Scan') DROP PROCEDURE sp_Lock_Scan GO CR ...
- sqlserver 死锁查看辅助存储过程
USE [master] GO /****** Object: StoredProcedure [dbo].[sp_who_lock] Script Date: 03/23/2016 14:17:49 ...
- 查找 SqlServer死锁
use master if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[sp_who_lock]') ) dr ...
- SQLSERVER 死锁标志
最开始做DBA的时候,整天死锁到头痛1222,至今都能回想到这个错误窗口: 死锁定义:死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待 ...
- 验证SQLServer死锁进程
SELECT '现在没有阻塞和死锁信息' AS message -- 循环开始WHILE @intCounter <= @intCountProperties BEGIN-- 取第一条记录 SE ...
- sqlserver 死锁相关
参考 https://www.cnblogs.com/fuyuanming/p/5783421.html -- 查询死锁 select request_session_id spid, OBJECT_ ...
随机推荐
- 十问Android NFC手机上的卡模拟(转)
1, 问:能否在AndroidNFC手机上实现卡模拟? 答:在技术上可行,但是,对一般开发人员来讲,目前看来仅仅是技术上可行:( 2, 问:具体如何实现呢? 答:有两种方式:一种是基于硬件的,被称 ...
- blktrace + blkparse + btt 分析IO
blktrace是一款block层的trace工具,block层在IO路径上的位置: 一个IO的生命周期大约是: ● I/O enters block layer – it can be: – Rem ...
- 使用自连接、for xml path('')和stuff合并显示多行数据到一行中(转)
原文: http://njm.iteye.com/blog/795881 --使用 自连接.for xml path('')和stuff合并显示多行数据到一行中 --注 --1.计算列可以不用包含在聚 ...
- Spring4+Hibernate4事务小记
学习Spring+Hibernate,非常强大的框架,为了追新,就直接从最高版本开始学习了,这要冒很大的风险,因为网上可查到的资料大多是针对旧版本的,比如Spring3,Hibernate3. 根据我 ...
- angularJS实现无刷新文件下载
$scope.getExcel = function () { $http.post("/production/statistics/export", { storeId: $sc ...
- 使用itext直接替换PDF中的文本
直接说问题,itext没有直接提供替换PDF中文本的接口(查看资料得到的结论是PDF不支持这种操作),不过存在解决思路:在需要替换的文本上覆盖新的文本.按照这个思路我们需要解决以下几个问题: itex ...
- Linux安装ElasticSearch-2.2.0-分词器插件(Mmseg)
1.在gitpub上搜索elasticsearch-analysis,能够看到所有elasticsearch的分词器: 2.安装Mmseg分词器:https://github.com/medcl/el ...
- 解决方案,org.hibernate.LazyInitializationException: could not initialize proxy - no Session
org.hibernate.LazyInitializationException: could not initialize proxy - no Session org.hibernate.pro ...
- 【struts2】<s:url>标签
<s:url>标签一般和超链接 <a>一起使用,用于带多个参数. <a href=" <s:url action=""> < ...
- 验证码识别 图像降噪 Python (一)
原始图片: 降噪后的图片 实现代码: # coding:utf-8 import sys, os from PIL import Image, ImageDraw # 二值数组 t2val = {} ...