本文记录达梦数据库(DM Database)的事务隔离级别相关内容,帮助读者理解并掌握达梦数据库不同隔离级别的特性和使用场景。
达梦数据库的默认隔离级别是“读已提交”(Read Committed)。这意味着,一个事务只能读取到其他事务已经提交的数据,避免了脏读现象的发生。
通过修改dm.ini静态参数ISOLATION_LEVEL,可以控制数据库的全局事务隔离级别。设置命令如下:
-- 设置命令,重启数据库生效
sp_set_para_value(2,'ISOLATION_LEVEL',1);
-- 查看当前事务隔离级别
select isolation from v$trx;
在“读未提交”隔离级别下,当一个会话的事务中的数据被修改但尚未提交时,其他会话可以读取到这些修改后的数据。然而,如果原会话回滚了这些修改,其他会话将产生幻读现象。
示例:
-- 创建测试表并插入数据
create table t1(id int,name varchar(100));
insert into t1 values(1,'a');
commit;
-- 窗口1:设置读未提交隔离级别,并尝试更新数据
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
update t1 set name = 'b' where id =1;
select * from t1; -- 此时可以读取到修改后的数据'b'
-- 窗口2:同样设置读未提交隔离级别,并尝试读取数据
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
select * from t1; -- 此时也可以读取到修改后的数据'b'
-- 窗口1:回滚事务
rollback;
-- 窗口2:再次读取数据,发现产生了幻读,只能读取到未修改前的数据'a'
select * from t1;
这是达梦数据库的默认隔离级别,因此不再赘述。
设置命令:
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
在“重复读”隔离级别下,当一个会话开启一个事务后,其他会话修改并提交的数据不会影响当前会话的读取结果。这保证了在同一个事务中多次读取同一数据时,能够得到相同的结果。
示例:
-- 创建测试表并插入数据
create table t1(id int,name varchar(100));
insert into t1 values(1,'a');
commit;
-- 窗口1:设置重复读隔离级别,并尝试更新数据
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
update t1 set name = 'b' where id =1;
select * from t1; -- 此时读取到修改后的数据'b'
-- 窗口2:同样设置重复读隔离级别,并尝试读取数据
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
select * from t1; -- 此时读取到未修改前的数据'a'
-- 窗口1:提交事务
commit;
-- 窗口2:再次读取数据,发现仍然读取到未修改前的数据'a',这就是可重复读
select * from t1;
“串行化”隔离级别是最高的隔离级别,它要求消除不可重复读取和幻像读现象。然而,与读提交隔离级相比,串行化事务的查询本身不会增加任何代价,但修改数据可能引发“串行化事务被打断”错误。
当一个串行化事务试图更新或删除数据时,如果这些数据在此事务开始后被其他事务修改并提交,DM数据库将报错:“串行化事务被打断”。因此,应用开发者应充分考虑串行化事务带来的回滚及重做事务的开销,并捕获该错误进行相应处理。
设置命令:
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
示例:
-- 创建测试表并插入数据
create table t1(id int,name varchar(100));
insert into t1 values(1,'a');
commit;
-- 窗口1:设置串行化隔离级别,并尝试更新数据
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
update t1 set name = 'b' where id =1;
-- 窗口2:同样设置串行化隔离级别,并尝试更新相同的数据
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
update t1 set name = 'c' where id =1; -- 此时会卡住,等待窗口1提交或回滚
-- 窗口1:提交事务
commit;
-- 窗口2:报错:-7066: 串行化事务被打断
达梦技术社区地址: https://eco.dameng.com
文章
阅读量
获赞