注册
达梦的事务隔离级别浅谈
培训园地/ 文章详情 /

达梦的事务隔离级别浅谈

Jetzhu 2023/02/16 1269 0 1

在 SQL-92 标准中,定义了四种隔离级别:读未提交、读提交、可重复读和串行化。那达梦数据库是如何支持事务隔离级别的呢?
DM数据库支持三种事务隔离级别:读未提交、读提交和串行化。其中,读提交是 DM 数据库默认使用的事务隔离级别【在这一点,DM跟DB2和Oracle保持一致。MySQL默认隔离级别是RR(可重复读)】。可重复读升级为更严格的串行化隔离级。
1. 读未提交
读未提交隔离级别是最不严格的隔离级别。在使用这个隔离级别时,有可能发生脏读、不可重复读和幻像。一般来说,读未提交隔离级别通常只用于访问只读表和只读视图,以消除可见性判断带来的系统开销,提升查询性能。
用户可以在事务开始时使用以下语句,设定事务为读未提交隔离级:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

此外,DM 还允许用户在 SELECT 语句的末尾加上 WITH UR 以指定当前查询语句的隔离级为读未提交,即允许脏读,并在该语句结束时自动恢复为原来的隔离级。

SELECT * FROM DMHR.DEPARTMENT T WHERE T.DEPARTMENT_ID=101 WITH UR;
查看系统当前隔离级别:
image.png

可以看到,虽然select的时候指定隔离级别UR,但是系统的隔离级别没有变。
2. 读提交
DM 数据库的读提交隔离可以确保只访问到已提交事务修改的数据,保证数据处于一致性状态,能够满足大多数应用的要求,并最大限度的保证系统并发性能,但可能会出现不可重复读取和幻读。
用户可以在事务开始时使用以下语句设定事务为读提交隔离级:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

3. 串行化
在要求消除不可重复读取或幻读的情况下,我们可以设置事务隔离级为串行化。跟读提交隔离级相比,串行化事务的查询本身不会增加任何代价,但修改数据可能引发“串行化事务被打断”错误。
具体来说,当一个串行化事务试图更新或删除数据时,而这些数据在此事务开始后被其他事务修改并提交时,DM 数据库将报“串行化事务被打断”错误。应用开发者应该充分考虑串行化事务带来的回滚及重做事务的开销,从应用逻辑上避免对相同数据行的激烈竞争导致产生大量事务回滚。并结合应用逻辑,捕获“串行化事务被打断”错误,进行事务重做等相应处理。如果系统中存在长时间运行的写事务,并且该长事务所操作的数据还会被其他短
事务频繁更新的话,最好避免使用串行化事务。
用户可以在事务开始时使用以下语句设定事务为串行化隔离级:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服