怎么让这两段代码同时执行不产生死锁?

shenyang1987 2015-11-16 04:34:07



begin tran
select * from lives with(updlock)
update lives set play='羽毛球'
waitfor delay '0:0:5'
select * from dbo.Earth with(updlock)
update dbo.Earth set Animal='老虎'
commit tran



begin tran
select * from dbo.Earth with(updlock)
update Earth set Animal='老虎'
waitfor delay '0:0:5'
select * from lives with(updlock)
update lives set play='羽毛球'
commit tran


这两段代码放在分别放入2个查询窗口,在5秒内同时运行 为什么还是会发生死锁
本来是没有加updlock发生死锁可以理解,为什么加了updlock还是会发生死锁
...全文
112 点赞 收藏 11
写回复
11 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
shenyang1987 2015-11-17
引用 7 楼 x_wy46 的回复:
我去,你第一个事务先锁住了A,第二个事务先锁住B, 第一个事务锁定A之后并没有立马锁定B,第二个事务锁定B之后并没有立马锁定A 然后第一个事物请求被第二个事务锁定的B,第二个事务请求被第一个事务锁定的A 就造成了死锁
最后一句 "然后第一个事物请求被第二个事务锁定的B,第二个事务请求被第一个事务锁定的A 就造成了死锁"  它不是会先等待释放再去请求吗?
回复
shenyang1987 2015-11-17
谢谢大家了
回复
shenyang1987 2015-11-17
引用 8 楼 szx1999 的回复:
[quote=引用 6 楼 shenyang1987 的回复:] [quote=引用 5 楼 x_wy46 的回复:] 晕了,你应该把顺序写的一样,都先处理live表,在处理Earth表
顺序一样是可以的。但是我没搞懂的是 顺序不一样的为什么会死锁 加了updlock 不是会先锁住 吗,然后执行另外一条语句的时候会等锁释放 然后再执行。 [/quote] 你想让这两个tran不死锁,应该在tran1中的开头锁Earth表,而不是lives表。这样tran2在尝试获得Earth表时就会等待。[/quote] 恩
回复
等不到来世 2015-11-17
引用 6 楼 shenyang1987 的回复:
[quote=引用 5 楼 x_wy46 的回复:] 晕了,你应该把顺序写的一样,都先处理live表,在处理Earth表
顺序一样是可以的。但是我没搞懂的是 顺序不一样的为什么会死锁 加了updlock 不是会先锁住 吗,然后执行另外一条语句的时候会等锁释放 然后再执行。 [/quote] 你想让这两个tran不死锁,应该在tran1中的开头锁Earth表,而不是lives表。这样tran2在尝试获得Earth表时就会等待。
回复
专注or全面 2015-11-16
我去,你第一个事务先锁住了A,第二个事务先锁住B, 第一个事务锁定A之后并没有立马锁定B,第二个事务锁定B之后并没有立马锁定A 然后第一个事物请求被第二个事务锁定的B,第二个事务请求被第一个事务锁定的A 就造成了死锁
回复
shenyang1987 2015-11-16
引用 5 楼 x_wy46 的回复:
晕了,你应该把顺序写的一样,都先处理live表,在处理Earth表
顺序一样是可以的。但是我没搞懂的是 顺序不一样的为什么会死锁 加了updlock 不是会先锁住 吗,然后执行另外一条语句的时候会等锁释放 然后再执行。
回复
专注or全面 2015-11-16
晕了,你应该把顺序写的一样,都先处理live表,在处理Earth表
回复
shoppo0505 2015-11-16
你的代码都在begin tran 和 commit tran中执行,这样的话,对于数据库的操作,要在commit tran之后才会真正完成,资源才会释放,不是在每个语句之后释放资源。
回复
shenyang1987 2015-11-16
引用 2 楼 x_wy46 的回复:
这两段代码放在分别放入2个查询窗口,在5秒内同时运行 为什么还是会发生死锁 本来是没有加updlock发生死锁可以理解,为什么加了updlock还是会发生死锁 加了updlock,updlock在查询语句执行完成之后释放了updlock锁 应该是select * from lives with(updlock,holdlock)这样updlock才能保留更新锁一直到事务结束
with(updlock,holdlock)这样写还是一样的。
回复
专注or全面 2015-11-16
这两段代码放在分别放入2个查询窗口,在5秒内同时运行 为什么还是会发生死锁 本来是没有加updlock发生死锁可以理解,为什么加了updlock还是会发生死锁 加了updlock,updlock在查询语句执行完成之后释放了updlock锁 应该是select * from lives with(updlock,holdlock)这样updlock才能保留更新锁一直到事务结束
回复
shenyang1987 2015-11-16
怎么邀请大牛来答一下哇
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2015-11-16 04:34
社区公告
暂无公告