为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。
【DM版本】:DM8
【操作系统】:win
【CPU】:x86_64
【问题描述】*:按以下顺序分别执行两个事务```sql
CREATE TABLE T1(C1 INT);
/*tx1*/ SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
/*tx2*/ SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
/*tx2*/ start transaction;
/*tx1*/ start transaction;
/*tx1*/ insert into t1 values(1);
/*tx1*/ update t1 set c1=3 where c1=2;
/*tx1*/ commit;
/*tx2*/ select * from t1;--查询
/*tx2*/ delete from t1;--删除
/*tx2*/ insert into t1 values(2);
/*tx2*/ commit;
tx2的查询查不到tx1插入的记录{1},也没有删除,最终表中记录{1,2};
按tx1,tx2串行,最终表中记录{2};
按tx2,tx1串行,最终表中记录{3,1};
mysql中,tx2的查询查到记录{1},也删除了{1}条记录,最终表中记录{2}
您的以上测试验证结果正确,说明达梦事务管理完全符合串行化的隔离级别。
在串行隔离级别中,事务tx2读不到tx1提交的记录(1),说明消除了“幻读”并且“可重复读”
可以参考手册:事务管理
19.7.2 串行化隔离级
在要求消除不可重复读取或幻读的情况下,我们可以设置事务隔离级为串行化。跟读提交隔离级相比,串行化事务的查询本身不会增加任何代价,但修改数据可能引发“串行化事务被打断”错误。