数据绝对准确性
, 还是要最高的并发性能
, 亦或牺牲部分并发性能以换取数据的相对准确
。
在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数据库-数据表
- 2023年10月21日是补墙的黄道吉日吗 2023年10月21日补墙好吗
- 乔丹的招牌动作有哪些
- 包贝尔的电影有哪些