事务的隔离级别
四中隔离级别
MySQL 有四种隔离级别,我们来看一下这四种隔离级别的基本定义:
- Read uncommitted(读未提交,简称:RU):在该隔离级别,所有事务都可以看到其它未提交的事务的执行结果。可能会出现脏读。
- Read Committed(读已提交,简称:RC):一个事务只能看见已经提交事务所做的改变。因为同一事务的其它实例在该实例处理期间可能会有新的commit,所以可能出现幻读。
- Repeatable Read(可重复读,简称:RR):这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。消除了脏读、不可重复读,默认也不会出现幻读。
- Serializable(串行):这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。
如何选择合适的事务隔离级别
在上面的内容中,我们认识了事务隔离级别,那么应该怎样选择合适的事务隔离级别呢?
- 对于 RU 隔离级别,会导致脏读,从性能上看,也不会比其它隔离级别好太多,因此生产环境不建议使用。
- 对于 RC 隔离级别,相比RU隔离级别,不会出现脏读;但是会出现幻读,一个事务中的两次执行同样的查询,可能得到不一样的结果。
- 对于 RR 隔离级别,相比 RC 隔离级别,不会出现幻读(RR 隔离级别通过间隙锁解决了幻读),但是相对于 RC,锁的范围可能更大了。
- 对于 Serializable 隔离级别,因为它强制事务串行执行,会在读取的每一行数据上都加锁,因此可能会导致大量的超时和锁争用的问题。生成环境很少使用。
因此总的来说,建议在RC和RR两个隔离级别中选一种,如果能接受幻读,需要并发高点,就可以配置成 RC,如果不能接受幻读的情况,就设置成 RR 隔离级别。