达梦数据库允许多个客户端同时访问。当这些客户端并发访问数据库中同一部分的数据时,如果没有采取必要的隔离措施就容易造成并发一致性问题,从而破坏数据的完整性。考虑下图中的场景:
在时间点1上,var的数值是100。客户端A在时间点2的时候更新了它的值为200,但没有提交事务。在时间点3的时候,客户端B读取到了客户端A还未提交的数值200。但在时间点4,客户端A执行了回滚操作。那么,对于客户端B来说,如果在时间点5再次读取数据,得到就应该是100。那么客户端B就有了数据不一致的问题。而造成问题的根本原因在,客户端B读取到了客户端A还没有提交的事务中的数据。
为了解决数据在并发访问时,数据的一致性问题。在SQL标准中定义了四种事务的隔离级别,它们分别是:读未提交(READ-UNCOMMITTED)、读已提交(READ-COMMITTED)、可重复读(REPEATABLE-READ)和可序列化读(SERIALIZABLE)。
达梦数据库支持三种事务隔离级别:读未提交(READ-UNCOMMITTED)、读提交(READ-COMMITTED)和串行化(SERIALIZABLE)。其中,读提交是DM 数据库默认使用的事务隔离级别,可重复读升级为更严格的串行化隔离级。
视频讲解如下:
在达梦数据库中要查看默认的事务隔离级别,可以通过下面的方式来获取。
(1)使用管理员登录数据库。
SQL> conn sysdba/Welcome_1
(2)执行下面的语句获取事务的隔离级别。
SQL> select para_name,para_value, case para_value when 1 then 'Read Commited' when 3 then 'Serializable' else 'None' end as "隔离级别" from v$dm_ini where para_name='ISOLATION_LEVEL'; # 输出的信息如下: 行号 PARA_NAME PARA_VALUE 隔离级别 ------ --------------- ---------- ------------- 1 ISOLATION_LEVEL 1 Read Commited # 从输出的信息可以看出,DM数据库默认的事务隔离级别是读已提交(READ-COMMITTED)。
数据库在不同的事务隔离级别下会有不同的行为,从而在并发访问数据的时候会带来不同的问题。下表列举了在不同的SQL标准事务隔离级别下,数据库可能存在的不同问题。
由于达梦数据库默认的事务隔离级别是读已提交(READ-COMMITTED),因此在达梦数据库中默认是不存在脏读问题的。