将两个事务的sql顺序调整为一致,也能避免死锁。
2)大事务拆小。大事务更倾向于死锁,如果业务允许,将大事务拆小。
3)在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁概率。
4)降低隔离级别。如果业务允许,将隔离级别调低也是较好的选择,比如将隔离级别从RR调整为RC,可以避免掉很多因为gap锁造成的死锁。
5)为表添加合理的索引。可以看到如果不走索引将会为表的每一行记录添加上锁,死锁的概率大大增大。
总结
本文介绍了MySQL数据锁以及事务的一些知识点,下面我们来总结一下;
不同的存储引擎支持的锁的力度也不一样:
- InnoDB:表锁行锁都支持(也做了演示);
- 当查询走的索引的时候,这个时候锁的就是行;
- 当查询没走的索引的时候,这个时候锁的就是表;
- MyISAM:只支持表锁;
数据库锁从锁的粒度我们可以分为两大类,它们各自的特点如下::
- 表锁:开销小,加锁快;不会出现死锁;锁定力度大,发生锁冲突概率高,并发度低;
- 行锁:开销大,加锁慢;会出现死锁;锁定力度小,发生锁冲突的概率低,并发度高;
悲观锁:总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据;
乐观锁:总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据;
最后
最后说一下,本文的参考文章:数据库的两大神器
大家可以去看一下原文,本人也是小菜鸡一枚,说的有问题还望大家指出来;
大家共同学习,一起进步。