事务并发带来的问题和如何解决?
脏读
针对未提交的数据
若没加锁之前,事务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为表增加合适的索引,因为若不走索引锁的是表锁