事务并发带来的问题和如何解决?
脏读
针对未提交的数据
![](https://img.haomeiwen.com/i5359801/906c85138dd9acbd.png)
若没加锁之前,事务A在id=1读出的数据是18,但因为事务B回滚掉,导致是脏数据,解决办法:加排他锁
不可重复读
针对其他提交前后,总记录数不变,重点是修改
![](https://img.haomeiwen.com/i5359801/c4da77d51876a050.png)
幻读
针对其他提交前后,总记录数发生改变,重点是新增或插入
![](https://img.haomeiwen.com/i5359801/4b05f0eec1431794.png)
隔离级别
分类
![](https://img.haomeiwen.com/i5359801/9c80fc7f7ad6e6d9.png)
innodb对隔离级别的支持
![](https://img.haomeiwen.com/i5359801/ce5a114d9f2c6440.png)
死锁
死锁是什么
事务之间相互等待对方锁的释放
例子:
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为表增加合适的索引,因为若不走索引锁的是表锁
网友评论