死锁问题

Garnett_KG Garnett_KG 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区


CREATE TABLE tb (
ID INT IDENTITY(1,1),
PK1 SMALLDATETIME,
PK2 CHAR(5),
PK3 CHAR(10),
DATA1 BIT,
DATA2 INT,
DATA3 VARCHAR(50) ,
CONSTRAINT PK_ID PRIMARY KEY NONCLUSTERED(ID)
)
GO

CREATE CLUSTERED INDEX CI_PK1_PK2_PK3 ON tb(PK1,PK2,PK3)

GO


INSERT INTO tb(PK1,PK2,PK3,DATA1,DATA2,DATA3)
SELECT '2009/08/15','A1','AAAA1',0,10,'Record 1'
UNION ALL
SELECT '2009/08/15','A1','AAAA2',0,10,'Record 2'
UNION ALL
SELECT '2009/08/15','A2','AAAA1',0,10,'Record 3'
UNION ALL
SELECT '2009/08/15','A2','AAAA2',0,10,'Record 4'
UNION ALL
SELECT '2009/08/15','A3','AAAA1',0,10,'Record 5'
UNION ALL
SELECT '2009/08/15','A3','AAAA2',0,10,'Record 6'
UNION ALL
SELECT '2009/08/14','B1','BBBBB1',0,10,'Record 7'
UNION ALL
SELECT '2009/08/14','B1','BBBBB2',0,10,'Record 8'
UNION ALL
SELECT '2009/08/14','B2','BBBBB1',0,10,'Record 9'
UNION ALL
SELECT '2009/08/14','B2','BBBBB2',0,10,'Record 10'
UNION ALL
SELECT '2009/08/14','B3','BBBBB1',0,10,'Record 11'
UNION ALL
SELECT '2009/08/14','B3','BBBBB2',0,10,'Record 12'


--Connection 1中执行:
BEGIN TRAN
UPDATE tb SET DATA1=1 WHERE PK1='2009/08/14' AND PK2='B2' AND PK3='BBBBB1'
--(1 行受影响)


--Connection 2中执行:
BEGIN TRAN
UPDATE tb SET DATA1=1 WHERE PK1='2009/08/14' AND PK2='B2' AND PK3='BBBBB2'
--(1 行受影响)

--返回Connection 1中执行
UPDATE tb SET DATA1=1 WHERE PK1='2009/08/14' AND PK3='BBBBB2' AND DATA3='Record 12'
/*
--执行计划如下
1 1 UPDATE [tb] set [DATA1] = @1 WHERE [PK1]=@2 AND [PK3]=@3 AND [DATA3]=@4
1 1 |--Clustered Index Update(OBJECT:([tempdb].[dbo].[tb].[CI_PK1_PK2_PK3]), SET:([tempdb].[dbo].[tb].[DATA1] = [Expr1004]))
0 0 |--Compute Scalar(DEFINE:([Expr1004]=CONVERT_IMPLICIT(bit,[@1],0)))
1 1 |--Top(ROWCOUNT est 0)
1 1 |--Clustered Index Seek(OBJECT:([tempdb].[dbo].[tb].[CI_PK1_PK2_PK3]), SEEK:([tempdb].[dbo].[tb].[PK1]=CONVERT_IMPLICIT(smalldatetime,[@2],0)), WHERE:([tempdb].[dbo].[tb].[PK3]=[@3] AND [tempdb].[dbo].[tb].[DATA3]=[@4]) ORDERED FORWARD)

*/

--返回Connection 2中执行:
UPDATE tb SET DATA1=1 WHERE PK1='2009/08/14' AND PK3='BBBBB1' AND DATA3='Record 9'
/*
--执行计划如下:
1 1 UPDATE [tb] set [DATA1] = @1 WHERE [PK1]=@2 AND [PK3]=@3 AND [DATA3]=@4
1 1 |--Clustered Index Update(OBJECT:([tempdb].[dbo].[tb].[CI_PK1_PK2_PK3]), SET:([tempdb].[dbo].[tb].[DATA1] = [Expr1004]))
0 0 |--Compute Scalar(DEFINE:([Expr1004]=CONVERT_IMPLICIT(bit,[@1],0)))
1 1 |--Top(ROWCOUNT est 0)
1 1 |--Clustered Index Seek(OBJECT:([tempdb].[dbo].[tb].[CI_PK1_PK2_PK3]), SEEK:([tempdb].[dbo].[tb].[PK1]=CONVERT_IMPLICIT(smalldatetime,[@2],0)), WHERE:([tempdb].[dbo].[tb].[PK3]=[@3] AND [tempdb].[dbo].[tb].[DATA3]=[@4]) ORDERED FORWARD)

*/

执行不久就会跳出死锁的信息,请问这是为什么?

300分送给答对的人。

...全文

相关推荐

哲学家就餐问题与死锁

理解死锁的概念,掌握死锁预防方法。 死锁是进程并发执行过程中可能出现的现象,哲学家就餐问题是描述死锁的经典例子。假设有几位哲学家围坐在一张餐桌旁,桌上有吃不尽的食品,每两位哲学家之间摆放着一根筷子,筷子的个数与哲学家的数量相等,每一位哲学家要么思考,要么等待,要么拿起左右两根筷子进餐。本设计假设有五个哲学家和五根筷子,它们的编号都是从0到4。 如果每位哲学家都拿起左边的筷子,就会发生死锁。 为了防止死锁,可以采用资源预分配法或者资源按序分配法。资源预分配法是指进程在运行前一次性地向系统申请它所需要的全部资源,如果系统当前不能够满足进程的全部资源请求,则不分配资源, 此进程暂不投入运行,如果系统当前能够满足进程的全部资源请求, 则一次性地将所申请的资源全部分配给申请进程。资源按序分配法是指事先将所有资源类全排序, 即赋予每一个资源类一个唯一的整数,规定进程必需按照资源编号由小到大的次序申请资源。 在哲学家就餐问题中,要采用资源预分配法只需让每个哲学家同时申请左右两根筷子。要采用资源按序分配法只需规定每个哲学家先申请左右两根筷子中编号小的筷子,再申请编号大的筷子。

wasai1314

数据库死锁-解决死锁问题的三种办法

解决死锁问题的三种方法:预防死锁,检测死锁及避免死锁。

emoking

多线程死锁问题

死锁问题,java多线程死锁

a470786227

车辆行驶死锁问题

车辆行驶死锁问题,在Linux下用C语言完成下面模型:设有一个T型路口,其中A,B,C,D各处可容纳一辆车,车型方向如图所示。找出死锁并用有序分配法消除之,要求资源编号合理。

一介俗人66

java死锁问题

死锁问题是个写代码过程中可能遇到的问题,这是我学习中看到的例子

woshiyexinjie
评论 38
收藏 已收藏
分享
返回顶部
Garnett_KG
疑难问题 22,298 成员 121,727 内容