首批通过分布式安全可靠测评,为关键业务系统打造
MySQL 模式的事务隔离级别
更新时间:2026-03-12 20:58:04
MySQL 模式支持的隔离级别
OceanBase 数据库在 MySQL 模式下,支持四种隔离级别:
读未提交(Read Uncommitted):一个事务可以读取到另一个事务未提交的数据。当事务 A 修改一个数据项但尚未提交,事务 B 可以立即看到这些未提交的更改。如果事务 A 回滚更改(即取消它的操作),事务 B 读取的数据就会变成之前存在的、但现在已经不存在的“脏”数据。当前 OceanBase 仅语法上支持*读未提交(Read Uncommitted)*隔离级别,当用户指定读未提交的隔离级别时,实际使用的是读已提交。
读已提交(Read Committed):一个事务执行的查询,只能看到这次查询开始之前提交的数据。读已提交无法防止不可重复读和幻读两种异常情况。
可重复读(Repeatable Read):事务内不同时间读到的同一批数据是一致的。
可串行化(Serializable):该隔离级别类似 Oracle 数据库的 Serializable,并非严格意义上的 Serializable。
OceanBase 数据库默认的隔离级别为读已提交(Read Committed)。
隔离级别行为对比
MySQL 数据库支持读未提交、读已提交、可重复读和可串行化四种隔离级别,OceanBase 数据库的 MySQL 模式在这四种隔离级别上与 MySQL 数据库均有一定差异。
读未提交: MySQL 数据库支持读未提交,而 OceanBase 数据库仅支持读未提交语法。当前 OceanBase 仅语法上支持*读未提交(Read Uncommitted)*隔离级别,当用户指定读未提交的隔离级别时,实际使用的是读已提交。
读已提交: 在读已提交隔离级别下判断行是否满足更新条件时,MySQL 数据库使用半一致性读,如果一行已经被并发事务更新,MySQL 数据库会等待并发事务的结束,然后在最新版本上判断是否需要更新;而在 OceanBase 数据库中,无论并发事务是否更新,总是基于语句快照中的版本来判断一行是否满足更新条件。
可重复读: 在可重复读隔离级别下发生写冲突时,MySQL 数据库中后写的事务会等待先写的事务结束,如果先写的事务回滚,后写的事务则在原版本上直接更新,如果先写的事务提交,后写的事务会在新提交的版本上再进行更新;OceanBase 数据库中后写的事务会等待先写的事务结束,如果先写的事务回滚,后写的事务则在原版本上直接更新,如果先写的事务提交,后写的事务会回滚并返回错误。
可串行化: MySQL 数据库的可串行化隔离级别使用两阶段锁(2PL),能够保证严格的可串行化;OceanBase 数据库的可串行化隔离级别使用快照隔离(Snapshot Isolation),不能保证严格的可串行化。
隔离级别设置方法
设置隔离级别有两种方式,分别为 Global 级别和 Session 级别。
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL [READ COMMITTED | REPEATABLE READ | SERIALIZABLE | READ UNCOMMITTED];
隔离级别使用限制
不允许在事务执行过程中设置隔离级别,否则会报如下错误:
ERROR 1568 (25001): Transaction characteristics can't be changed while a transaction is in progressGlobal 级别的隔离级别可以被 Session 级别的隔离级别覆盖。