其实所有的死锁最深层的原因就是一个:资源竞争
表现一:
一个用户A 访问表A(锁住了表A),然后又访问了表B
另一个用户B 访问了表B(锁住了表B),这时他又企图访问表A
这个时候用户A由于用户B已经锁住了表B,它必须等待用户B释放表B,才能继续进行访问,所以这时用户A什么都干不了了
同样的用户B要等用户A释放表A才能继续接下来的操作,这时就发生了资源竞争,极有可能产生死锁
解决方法:
这种死锁一般是由于你的程序BUG产生的,除了调整你的程序逻辑别无他法
1:尽量避免同时锁定两个资源。
2:必须同时锁定两个资源的时候,要保证在任何时刻都应该按照相同的顺序来锁定资源。
表现二:
用户A读一条记录,然后修改这个记录
这个时候用户B也想要修改这条记录
这里用户A的事务里的锁性质由共享锁企图上升到独占锁的程度(for update),而用户B里的独占锁由于A有共享锁的存在所以他必须等A释放掉共享锁,而A由于B的独占锁而无法上升的独占锁也就不可能释放共享锁,这时双方都想独占的情况下 就出现了死锁。
这种情况的死锁比较隐蔽,但是其实在稍大点的项目当中都是经常发生的。
解决方法:
让用户A的事务(即先读后写类型的操作),在select时就是用Update lock
语法如下:
select * from table with(updlock) wher ....