展开全部
前面两位兄弟回答的不是死锁,是正常的锁定。
死锁是这样形成的,假设有两个事物A和B
A事物在执行中需要更新两个表,假设为T1,T2,此时A已执行完T1,正在申请使用T2.
B事物也需要更新这两个表,但B事物先执行了T2,正在申请使用T1,
因为T1已被A事物锁定,所以B必须等待A事物执行完后释放锁,但A事物此时正在申请T2,而T2确被B事物先锁定了,需等待B事物完成后释放锁后才可获得T2的锁,此时死锁就发生了,如果没有死锁机制,这两个事物就会一直等下去。
sql server会定期检查死锁,如果发现死锁,就会权衡两个事物,牺牲掉其中一个执行代价较小的事物,使另一个事物能继续执行。
要避免死锁的发生,有很多需要注意的,如
1.保持事物尽可能的简短。
2。事物更新的顺序尽量一致,如上例中A和B如果更新顺序都为T1,T2或T2,T1的话就不会发生死锁了。
3.可以修改锁的粒度,如页锁改为行锁
死锁是这样形成的,假设有两个事物A和B
A事物在执行中需要更新两个表,假设为T1,T2,此时A已执行完T1,正在申请使用T2.
B事物也需要更新这两个表,但B事物先执行了T2,正在申请使用T1,
因为T1已被A事物锁定,所以B必须等待A事物执行完后释放锁,但A事物此时正在申请T2,而T2确被B事物先锁定了,需等待B事物完成后释放锁后才可获得T2的锁,此时死锁就发生了,如果没有死锁机制,这两个事物就会一直等下去。
sql server会定期检查死锁,如果发现死锁,就会权衡两个事物,牺牲掉其中一个执行代价较小的事物,使另一个事物能继续执行。
要避免死锁的发生,有很多需要注意的,如
1.保持事物尽可能的简短。
2。事物更新的顺序尽量一致,如上例中A和B如果更新顺序都为T1,T2或T2,T1的话就不会发生死锁了。
3.可以修改锁的粒度,如页锁改为行锁
展开全部
你正在使用的资源被占用就出现死锁
SQL Server的话 sp_who2查看那死锁 kill ID 杀死进程 释放资源
SQL Server的话 sp_who2查看那死锁 kill ID 杀死进程 释放资源
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这就是sql server 的特性,当一个服务在占用数据库资源的时候,另一个服务就不能对数据库进行操作,否则就会出现死锁。这也是对数据库安全的保护,想要解决死锁也很简单,用sp_who2查看该死锁,用kill ID 杀死进程释放被占用的资源,如果在oracle里就是直接在sqlplus里敲rollback了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询