DM8 事务隔离级别:默认配置 + MySQL/Oracle 行为差异

DM8 事务隔离级别:默认配置 + MySQL/Oracle 行为差异

一、简介事务隔离是并发数据库核心机制,用来控制多会话同时读写数据时的可见性规则,解决三类并发问题:脏读、不可重复读、幻读。
SQL 标准定义 4 种隔离级别(由低到高):
读未提交 Read Uncommitted
读已提交 Read Committed(RC)
可重复读 Repeatable Read(RR)
串行化 Serializable
关键前置结论
达梦 DM8 默认隔离级别:READ COMMITTED(读已提交 RC)
MySQL InnoDB 默认:REPEATABLE READ(可重复读 RR)
Oracle 默认:READ COMMITTED(读已提交 RC)
三者默认基线就不一样,直接导致同一段并发 SQL 出现完全不同结果,是国产化迁移最容易踩坑的隐形 bug。二、基础定义公式(量化三种并发异常)设两个事务 T1(读)、T2(写),同一行数据 R,初始值 V01)脏读 Dirty ReadT2 修改 R=V1 未提交;T1 读到 V1,T2 回滚,T1 拿到不存在的数据
公式:
(Read(T1,R) = V_1,\quad Write(T2,R)=V_1,\quad Rollback(T2))2)不可重复读 Non-Repeatable ReadT1 两次查询同一行,中间 T2 更新并提交,两次结果不一致
公式:
(Read_1(T1,R)=V_0,\quad Write(T2,R)=V_1,Commit(T2),\quad Read_2(T1,R)=V_1)3)幻读 Phantom ReadT1 按条件批量查询,中间 T2 插入 / 删除符合条件的数据并提交,T1 再次查询行数变化
公式:
(Count_1(T1,where cond)=N,\quad Insert(T2,R_{new},cond),Commit(T2),\quad Count_2(T1,where cond)=N+1)

三、DM8 隔离级别操作代码

  1. 查询当前数据库默认隔离级别.
-- DM8 查询全局默认隔离SELECTSF_GET_DEFAULT_ISOLATION_LEVEL();/* 返回值说明 0:读未提交 1:读已提交(RC默认) 2:可重复读(RR) 3:串行化 */-- 查询当前会话隔离级别SELECTSF_GET_SESSION_ISOLATION_LEVEL