表的死锁
产生原因
用户A--》A表(表锁)--》B表(表锁)
用户B--》B表(表锁)--》A表(表锁)
解决方案
这种死锁比较常见,是由于程序的BUG产生的,除了调整的程序的逻辑没有其它的办法。
对于数据库的多表操作时,尽量按照相同的顺序进行处理,尽量避免同时锁定两个资源,<br>如操 作A和B两张表时,总是按先A后B的顺序处理,<br>
必须同时锁定两个资源时,要保证在任何时刻都应该按 照相同的顺序来锁定资源。
死锁总结
对索引加锁顺序的不一致很可能会导致死锁, 所以如果可以, 尽量以相同的顺序来访问索引记录和 表. 在程序以批量方式处理数据的时候, 如果事先对数据排序, 保证每个线程按固定的顺序来处理记 录, 也可以大大降低出现死锁的可能.
间隙锁往往是程序中导致死锁的真凶, 由于默认情况下 MySQL 的隔离级别是 RR,所以如果能确定 幻读和不可重复读对应用的影响不大, 可以考虑将隔离级别改成 RC, 可以避免 Gap 锁导致的死锁.
为表添加合理的索引, 如果不走索引将会为表的每一行记录加锁, 死锁的概率就会大大增大
避免大事务, 尽量将大事务拆成多个小事务来处理. 因为大事务占用资源多, 耗时长, 与其他事务冲
突的概率也会变高.
避免在同一时间点运行多个对同一表进行读写的脚本, 特别注意加锁且操作数据量比较大的语句.
设置锁等待超时参数:innodb_lock_wait_timeout,在并发访问比较高的情况下,如果大量事务
因无法立即获得所需的锁而挂起,会占用大量计算机资源,造成严重性能问题,甚至拖跨数据库。 我们通过设置合适的锁等待超时阈值,可以避免这种情况发生。