MySQL数据库同Postgres一样,数据库有四种隔离级别
低级别的事务隔离可以提高事务的并发访问性能,却可能导致较多的并发问题(例如脏读、不可重复读、幻读等并发问题);高级别的事务隔离可以有效避免并发问题,但会降低事务的并发访问性能,可能导致出现大量的锁等待、甚至死锁现象。
1,read uncommitted(读取未提交的数据)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。该隔离级别很少用于实际应用。
2,read committed(读取提交的数据)
这是大多数数据库系统的默认隔离级别(如Oracle和Postgres等,但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已提交事务所做的改变。
3,repeatable read(可重复读)
这是MySQL默认的事务隔离级别,它确保同一事务内相同的查询语句,执行结果一致。
4,serializable(串行化)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突。换言之,它会在每条select语句后自动加上lock in share mode,为每个查询操作施加一个共享锁。在这个级别,可能导致大量的锁等待现象。该隔离级别主要用于InnoDB存储引擎的分布式事务。
脏读(Drity Read):一个事务可以读到另一个事务未提交的数据,脏读问题违背了事务的隔离性原则。
不可重复读(Non-repeatable read):同一个事务内两条相同的查询语句,查询结果不一致。
幻读(Phantom Read):同一个事务内,两条相同的查询语句,查询结果应该相同。但是,如果另一个事务同时提交了新数据,本事务再更新时,就会“惊奇的”发现了这些新数据,对此InnoDB存储引擎采用了多版本并发控制(MVCC)机制来解决幻读问题。
合理地设置事务的隔离级别,可以有效避免脏读、不可重复读、幻读等并发问题。