sql

事务并发的问题和死锁

2019-04-16  本文已影响9人  剑道_7ffc

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

脏读

针对未提交的数据

若没加锁之前,事务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为表增加合适的索引,因为若不走索引锁的是表锁

上一篇下一篇

猜你喜欢

热点阅读