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

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还是会发生死锁
...全文
149 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
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
  • 打赏
  • 举报
回复
怎么邀请大牛来答一下哇

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧