MySQL四种隔离级别
四种隔离级别
Read Uncommitted [‘ʌnkə’mɪtɪd](未提交读)
— 事务可以读取其它事务未提交的数据,可能会出现脏读(Dirty Read)不可重复读以及幻读
(其余不在事务中的正常select查询不会存在脏读的情况)
Read Committed(提交读)—读取提交内容(这种隔离级别也叫做不可重复读)
(一个事务只能看见已经提交的事务所做的改变,但是事务a读取的内容,另一个事务对其修改,提交之后,事务a多次执行相同的select可能得到不同结果。会出现不可重复读,幻读的问题)
Repeatable Read [ri’pi:təbl](可重复读)MySQL的默认事务隔离级别。
它确保在同一事务中多次读取同样的记录结果是一样的。当事务a开启的时候,事务b对a查找的内容进行修改,提交事务之后,事务a执行相同select得到的还是刚进入事务时候查到的内容。
有可能会出现 幻读 (Phantom Read)。幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。
innodb通过mvcc的一致性视图,解决了不加锁的select(快照读)的可重复读问题。但可能出现幻读问题,因为select的时候没有加锁,其它事务就有可能修改select的结果,导致select后续的操作幻读了。这个时候可以通过给select加锁的方式强制事务排序(加锁之后会存在记录锁和间隙锁,数据间隙部分也会锁住),避免出现幻读。
它在很多情况下避免了加锁操作,因此开销更低。
Serializable [ˈsɪˌriəˌlaɪzəbl] (可串行化),这是最高的隔离级别;此隔离模式无需手动加锁
在每个读的数据行上自动加读锁(共享锁)解决幻读的情况。在这个级别,可能导致大量的超时现象和锁争用的情况。实际很少使用这个隔离级别,除非需要确保数据一致性而且没有并发的情况下,才考虑使用。