脏读、幻读、不可重复读时如何解决的?
脏读、幻读、不可重复读时如何解决的?
解决脏读:
1. 事务隔离级别设置为:read committed。
2. 读取时加共享锁(update …lock in share mode),事务提交才会释放锁,修改时加排他锁(select…for update)。加排它锁后,不能对该条数据再加锁,其它事务即不能查询也不能更改数据。mysql InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,如果加排他锁可以使用select …for update语句,如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁,共享锁下其它用户可以并发读取,查询数据。但不能修改,增加,删除数据。资源共享。
解决不可重复读:
1. 事务隔离级别设置为Repeatable read。
2. 读取数据时加共享锁,写数据时加排他锁,都是事务提交才释放锁。读取时候不允许其他事物修改该数据,不管数据在事务过程中读取多少次,数据都是一致的,避免了不可重复读问题。
解决幻读:
MVCC加间隙锁的方式:
- 在**快照读**读情况下,mysql通过mvcc来避免幻读。
- 在**当前读**读情况下,mysql通过next-key来避免幻读。锁住某个条件下的数据不能更改。
重要
参考答案:
参考上一题。
