SQL的事务( 四 )


在SQL官方标准中,设立了以下四个隔离级别:
1. 读未提交(Read Uncommitted)在该隔离级别中,所有事务都可以看到其它未提交事务的执行结果,意味着会发生脏读不可重复读幻读
2. 读已提交(Read Committed)读已提交满足了隔离的基本定义:一个事务只能看见已经提交的事务的执行结果 。这是大部分数据库系统的默认隔离级别 , 比如Oracle、SQL Server,可以避免脏读,但仍会发生不可重复读幻读
3. 可重复读(Repeatable Read)事务A在读到一条数据之后,此时事务还没提交或回滚,接着事务B对该数据进行了修改并提交,那么事务A再次读取该数据,读到的还是原来的内容 。可以避免脏读不可重复读,但仍会发生幻读,这是MySQL默认的隔离级别 。
4. 可串行化(Serializable)确保事务可以从一个表中读取相同的行,在整个事务持续期间 , 禁止其它事务对该表相同行进行插入、更新,删除操作 。所有的问题都可以解决 , 但性能最为低下 。
SQL标准的四种隔离级别分别可能出现的并发问题

脏写脏读不可重复读幻读加锁读Read Uncommitted×√√√×Read Committed××√√×Repeatable Read×××√×Serializable××××√5.4 不同数据库的隔离级别SQL标准虽然有4种隔离级别,但不同的数据库的支持程度不一样 。

OracleMySQLSQL ServerRead Uncommitted×√√Read Committed√(默认)√√(默认)Repeatable Read×√(默认)√Serializable√√√Snapshot

√Read Committed Snapshot

√值得注意的是:

  1. MySQL 的实现 Repeatable Read 在一定程度上也可以解决幻读的问题(快照读+MVCC机制),与SQL官方标准略有区别;
  2. SQL Server 支持的隔离级别比SQL标准的还要多出两种 。
5.5 其它MySQL中查看隔离级别:
# 5.7.20之前SHOW VARIABLES LIKE 'tx_isolation';# 5.7.20及之后SHOW VARIABLES LIKE 'transaction_isolation';# 所有版本均可用SELECT @@transaction_isolation;MySQL中设置隔离级别:
SET [GLOBAL|SESSION] TRANSACTION_ISOLATION = '隔离级别';隔离级别可选项:> READ-UNCOMMITTED> READ-COMMITTED> REPEATABLE-READ> SERIALIZABLE或者:
SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL '隔离级别';隔离级别可选项:> READ UNCOMMITTED> READ COMMITTED> REPEATABLE READ> SERIALIZABLE
GLOBAL:对后续所有新开会话有效
SESSION:只对当前会话有效
无论设置什么级别,数据库一旦重启都以配置文件为准
【SQL的事务】

推荐阅读