事务并发的问题和死锁

事务并发带来的问题和如何解决?

脏读

针对未提交的数据

若没加锁之前,事务A在id=1读出的数据是18,但因为事务B回滚掉,导致是脏数据,解决办法:加排他锁

不可重复读

针对其他提交前后,总记录数不变,重点是修改

幻读

针对其他提交前后,总记录数发生改变,重点是新增或插入

隔离级别

分类

innodb对隔离级别的支持

死锁

死锁是什么

事务之间相互等待对方锁的释放

例子:

BEGIN;

update users set lastUpdate = NOW() where id = 1;

update t2 set `name`='test' where id =1;

rollback;

--其他会话

BEGIN;

update t2 set `name`='test' where id =1;

update users set lastUpdate = NOW() where id =1;

rollback;

死锁的避免

1类似的业务已固定的顺序访问表或行,目的避免形成循环

2如果条件允许,大事务拆小。原因:大事务出现死锁的概率较大

3在同一事务中,尽可能一次锁住所需要的所有的资源

4降低隔离级别

5为表增加合适的索引,因为若不走索引锁的是表锁

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容