。
在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
√值得注意的是:
- MySQL 的实现 Repeatable Read 在一定程度上也可以解决幻读的问题(快照读+MVCC机制),与SQL官方标准略有区别;
- SQL Server 支持的隔离级别比SQL标准的还要多出两种 。
# 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:对后续所有新开会话有效【SQL的事务】
SESSION:只对当前会话有效
无论设置什么级别,数据库一旦重启都以配置文件为准
推荐阅读
- 我的 Kafka 旅程 - Producer
- Windows esp-idf 安装
- 建议收藏 Java线程同步的四种方式详解
- 下 MySQL数据库-数据表
- 2000左右高性价比5G手机排行榜-2000元值得买的5g手机排行榜
- 微信聊天记录怎么恢复原来这么简单的啊(微信被误卸载了如何恢复聊天记录)
- 怎么创建微信群,自己当群主(怎么查自己是群主的群)
- SpringBoot 常用读取配置文件的 3 种方法!
- C++ STL 概述_严丝合缝的合作者们
- 引入Wukong让你的系统瞬间具备IOC能力