达梦数据库事务隔离级别测试 📅 2026/8/24 3:03:14 一、概述事务隔离级别是数据库并发控制的核心机制定义了事务之间的隔离程度不同的隔离级别有不同的并发性能和数据一致性保证。达梦数据库DM Database支持多种事务隔离级别本文档旨在通过实际测试验证不同隔离级别下的数据读取行为和并发控制效果。测试目标1. 验证达梦数据库各事务隔离级别的特性2. 演示脏读、不可重复读、幻读等并发问题的出现与消除3. 为生产环境的隔离级别选型提供参考依据。二、事务隔离级别说明2.1 SQL-92标准定义的四种隔离级别SQL-92标准定义了四种隔离级别读未提交READ UNCOMMITTED、读提交READ COMMITTED、可重复读REPEATABLE READ和串行化SERIALIZABLE。不同隔离级别对数据库并发问题的防护效果不同具体对应关系如下表所示隔离级别脏读不可重复读幻读读未提交√√√读提交×√√可重复读××√串行化×××2.2 达梦数据库支持的隔离级别达梦数据库支持三种事务隔离级别读未提交READ UNCOMMITTED、读提交READ COMMITTED和串行化SERIALIZABLE。其中读提交是达梦数据库默认事务隔离级别。达梦数据库无独立的可重复读隔离级别手动设置可重复读会自动升级为更严格的串行化隔离级别。达梦数据库隔离级别数值对应关系0读未提交READ UNCOMMITTED1读提交READ COMMITTED--默认2可重复读REPEATABLE READ自动升级为串行化3串行化SERIALIZABLE查看当前会话隔离级别SQL SELECT ISOLATION FROM V$TRX; 行号 ISOLATION ---------- ----------- 1 1 已用时间: 6.962(毫秒). 执行号:12601.查看全局隔离级别SQL SELECT PARA_VALUE FROM v$dm_ini WHERE para_name ISOLATION_LEVEL; 行号 PARA_VALUE ---------- ---------- 1 1 已用时间: 12.327(毫秒). 执行号:12602.三、隔离级别测试环境准备3.1 读未提交READ UNCOMMITTED隔离级别测试读未提交是数据库最宽松的事务隔离级别允许当前事务读取其他事务未提交的修改数据。该级别并发性能最优但数据一致性最差会产生脏读、不可重复读、幻读等并发问题生产环境几乎不使用实现方式方式一事务级全局设置SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;方式二语句级临时设置达梦数据库支持通过WITH UR语法单独为单条查询语句开启读未提交隔离级别语句执行完成后自动恢复原有隔离级别SELECT * FROM T_ISO WHERE ID 1 WITH UR;脏读测试读到未提交事务事务1SQL SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;操作已执行已用时间: 0.289(毫秒). 执行号:12605.SQL select * from t1;未选定行已用时间: 9.252(毫秒). 执行号:12606.SQLSQL insert into t1 values(1);影响行数 1已用时间: 11.555(毫秒). 执行号:12607.事务2SQL SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;操作已执行已用时间: 0.238(毫秒). 执行号:12801.SQL select * from t1;行号 ID---------- -------------------------1 1.000000000000000E00已用时间: 1.271(毫秒). 执行号:12802.重复读测试事务1SQL SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;操作已执行已用时间: 0.281(毫秒). 执行号:12810.SQLSQLSQL select * from t1;行号 ID---------- -------------------------1 1.000000000000000E002 2.000000000000000E00已用时间: 0.278(毫秒). 执行号:12811.SQL update t1 set id 3 where id 1;影响行数 1已用时间: 0.894(毫秒). 执行号:12812.SQL select * from t1;行号 ID---------- -------------------------1 3.000000000000000E002 2.000000000000000E00SQL commit;已用时间: 0.325(毫秒). 执行号:12813.事务2SQL SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;操作已执行已用时间: 0.280(毫秒). 执行号:12614.SQLSQLSQL select * from t1;行号 ID---------- -------------------------1 1.000000000000000E002 2.000000000000000E00已用时间: 0.366(毫秒). 执行号:12615.SQL select * from t1;行号 ID---------- -------------------------1 3.000000000000000E002 2.000000000000000E00已用时间: 2.596(毫秒). 执行号:12616.幻读测试读到已提交的插入语句事务2SQL insert into t1 values(2);影响行数 1已用时间: 7.749(毫秒). 执行号:12803.SQL commit;操作已执行已用时间: 2.828(毫秒). 执行号:12804.SQL事务1SQL select * from t1;行号 ID---------- -------------------------1 1.000000000000000E002 2.000000000000000E00已用时间: 0.662(毫秒). 执行号:12608.3.2 读提交READ COMMITTED隔离级别测试读提交是达梦数据库默认隔离级别核心特性为事务仅能读取其他事务已提交的数据彻底杜绝脏读问题。该级别在数据一致性和系统并发性能之间实现了良好平衡可满足绝大多数业务场景需求但仍存在不可重复读和幻读问题。实现方式事务级全局设置SET TRANSACTION ISOLATION LEVEL READ COMMITTED;脏读测试SQL select * from t1;行号 ID---------- -----------1 12 2已用时间: 3.107(毫秒). 执行号:13612.SQLSQL insert into t1 values(6);影响行数 1事务2SQL select * from t1;行号 ID---------- -----------1 12 2重复读测试SQL update t1 set id 8 where id 1;影响行数 1已用时间: 4.954(毫秒). 执行号:13614.SQL select * from t1;行号 ID---------- -----------1 82 23 6已用时间: 0.661(毫秒). 执行号:13615.SQL commit;事务2SQL select * from t1;行号 ID---------- -----------1 82 23 54 6幻读测试SQL select * from t1;行号 ID---------- -----------1 12 2已用时间: 3.107(毫秒). 执行号:13612.SQLSQL insert into t1 values(6);影响行数 1SQL commit;事务2SQL select * from t1;SQL select * from t1;行号 ID---------- -----------1 12 23 63.3 串行化SERIALIZABLE隔离级别测试串行化是达梦数据库最严格的事务隔离级别可彻底杜绝脏读、不可重复读、幻读所有并发问题保证并发事务执行结果与事务串行执行结果完全一致。该级别读操作性能损耗较小但写操作冲突概率高若事务执行过程中操作数据被其他事务修改提交会触发串行化事务被打断报错需应用层捕获异常并做重试处理。脏读测试SQL select * from t1;行号 ID---------- -----------1 12 2已用时间: 3.107(毫秒). 执行号:13612.SQLSQL insert into t1 values(6);影响行数 1事务2SQL select * from t1;行号 ID---------- -----------1 12 2重复读测试SQL update t1 set id 8 where id 1;影响行数 1已用时间: 4.954(毫秒). 执行号:13614.SQL select * from t1;行号 ID---------- -----------1 82 2已用时间: 0.661(毫秒). 执行号:13615.SQL commit;事务2SQL select * from t1;行号 ID---------- -----------1 12 2幻读测试SQL select * from t1;行号 ID---------- -----------1 12 2已用时间: 3.107(毫秒). 执行号:13612.SQLSQL insert into t1 values(6);影响行数 1SQL commit;事务2SQL select * from t1;行号 ID---------- -----------1 12 2四、隔离级别对比总结对比维度读未提交读提交默认串行化脏读可能不可能不可能不可重复读可能可能不可能幻读可能可能不可能并发性能最高高最低数据一致性最差中等最高适用场景只读快速查询、非核心统计场景绝大多数生产业务场景高一致性核心业务金融、账务MVCC可见性快照时机—语句执行时事务启动时MVCC机制补充说明达梦数据库基于MVCC多版本并发控制实现行级数据多版本管理实现读写不阻塞大幅提升并发能力。不同隔离级别快照采集时机不同读提交级别以单条语句执行时的事务快照判定数据可见性串行化级别以事务启动时的快照判定数据可见性。五、推荐配置建议1.通用业务场景默认使用读提交READ COMMITTED隔离级别平衡数据一致性与并发性能适配绝大多数生产业务2.高一致性场景金融交易、账务结算、核心数据统计等对数据零误差要求的场景可使用串行化级别需在应用层捕获串行化报错增加事务重试机制同时评估系统性能压力3.临时查询场景批量数据统计、离线查询、报表导出等非实时核心场景可使用读未提交级别或WITH UR语法减少数据库快照开销提升查询效率4.全局隔离级别修改可通过修改dm.ini配置文件的ISOLATION_LEVEL参数调整数据库全局隔离级别参数修改后需重启数据库生效执行语句如下sp_set_para_value(2, ISOLATION_LEVEL, 1);