MySQL的事务隔离级别隔离级别脏读不可重复读幻读读未提交 Read uncommittedOOO

读已提交 Read committedXOO

可重复读 RepeatablereadXXO

可串行化 SerializableXXX

大多数的数据库系统的默认事务隔离级别都是:Read committed

而MySQL的默认事务隔离级别是:Repeatable Read

READ UNCOMMITTED(未提交读)

这个级别事务中的修改,即使没有提交,对其他事务也都是可见的,事务可以读取未提交的数据,

这也被称为脏读,这个级别会导致许多问题,从性能上来说,READ UNCOMMITTED 级别不会比其他级别好太多,但却缺乏其他级别

的很多优点,除非真的非常有必要,在实际中一般很少使用。

READ COMMITTED(提交读)

大多数数据库默认隔离级别都是READ COMMITTED(MySQL不是)。一个事务开始时,只能“看见”已经提交的事务所做的修改。就是

说,一个事务从开始到提交之前,所做的任何事,对其他事务都是不可见的。这个级别有时也叫不可重复读,因为两次查询执行的结

果可能是不一致的。

REPEATABLE READ(可重复读)

可重复读解决了脏读的问题。它保证了同一个事务中多次读取同样的记录的结果是一致的。但是理论上却无法解决幻读的问题。所谓

幻读,指的是当某个事物在读取某个范围的记录时,另外一个事务又在该范围内插入了新的记录,当之前的事务再次读取该范围的

记录时,会产生幻行。

SERIALIZABLE(可串行化)

通过事务强制串行执行,避免幻读问题。会在读取的每一行数据上加锁,可能导致大量的超时和锁争用的问题。只有在非常需要保证

数据一致性而且可以接受没有并发的情况下,才考虑使用。

查询

SELECT @@global.tx_isolation;

SELECT @@session.tx_isolation;

SELECT @@tx_isolation;// 缺省是session

修改

用户可以用SET TRANSACTION语句改变单个会话或者所有新进连接的隔离级别。它的语法如下:

SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}

例如:1SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;

1set tx_isolation='read-committed';

注意:默认的行为(不带session和global)是为下一个(未开始)事务设置隔离级别。如果你使用GLOBAL关键字,语句在全局

对从那点开始创建的所有新连接(除了不存在的连接)设置默认事务级别。你需要SUPER权限来做这个。使用SESSION 关键字为

将来在当前连接上执行的事务设置默认事务级别。 任何客户端都能自由改变会话隔离级别(甚至在事务的中间),或者为下一

个事务设置隔离级别。