产生死锁原因:
1、事务之间对资源访问顺序的交替,两个用户相互访问了被对方锁住的表产生死锁;
2、两个用户并发修改同一记录产生死锁;
3、执行了一条不满足条件的语句,索引不当导致全局扫描产生死锁。

锁类型:
1、共享锁(Share Locks,即S锁):加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。
2、排它锁(Exclusive Locks,即X锁):当数据对象被加上排它锁时,其他的事务不能对它读取和修改。
3、独占锁:在共享锁的基础上,升级为独占锁。
4、更新锁:所有用户都可以读,但我将来可能会做更新操作,我已经获取了从共享锁(用来读)到排他锁(用来更新)的资格。一个事物只能有一个更新锁获此资格。

出现原因:
1、事务之间对资源访问顺序的交替:一个用户1 访问表A(锁住了表A),然后又访问表B;另一个用户2 访问表B(锁住了表B),然后企图访问表A;这时用户1由于用户2已经锁住表B,它必须等待用户2释放表B才能继续,同样用户2要等用户1释放表A才能继续,这就死锁就产生了。 解决方案:程序逻辑问题、注意表的调用顺序
2、并发修改同一记录:用户1查询一条纪录,然后修改该条纪录;这时用户2修改该条纪录,这时用户1的事务里锁的性质由查询的共享锁企图上升到独占锁,而用户2里的独占锁由于1有共享锁存在所以必须等1释放掉共享锁,而1由于2的独占锁而无法上升的独占锁也就不可能释放共享锁,于是出现了死锁 :
3、索引不当导致全表扫描:事务执行了一条不满足条件的语句执行了全表扫描或表数据量非常大索引建的过少或不合适的时候

查询死锁:

最后修改:2024 年 12 月 27 日
如果觉得我的文章对你有用,请随意赞赏