DM数据库事务隔离级别
在关系型数据库中,事务的隔离性分为四个隔离级别:读未提交、读提交、可重复读、串行化;DM 数据库支持三种事务隔离级别:读未提交、读提交和串行化。其中,读提交是 DM 数据库默认使用的事务隔离级别,可重复读升级为更严格的串行化隔离级。
一、读数据的现象
由于数据库事务隔离级别的不同,在读取数据的时候会出现脏读、不可重复度、幻像读等不同的读数据现象。
1.1 脏读(DirtyRead)
所谓脏读就是对脏数据的读取,而脏数据所指的就是未提交的已修改数据。也就是说,一个事务正在对一条记录做修改,在这个事务完成并提交之前,这条数据是处于待定状态的(可能提交也可能回滚),这时,第二个事务来读取这条没有提交的数据,并据此做进一步的处理,就会产生未提交的数据依赖关系,这种现象被称为脏读。如果一个事务在提交操作结果之前,另一个事务可以看到该结果,就会发生脏读。
脏读在数据库事务隔离级别为读未提交的情况下会出现。在实际生产环境中,脏读是一定要避免的。
1.2 不可重复读(Non-RepeatableRead)
一个事务先后读取同一条记录,但两次读取的数据不同,我们称之为不可重复读。如果一个事务在读取了一条记录后,另一个事务修改了这条记录并且提交了事务,再次读取记录时如果获取到的是修改后的数据,这就发生了不可重复读情况。
不可重复读在数据库事务隔离级别为读未提交和读提交的情况下出现。
1.3 幻像读(PhantomRead)
一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为幻像读。
幻像读在数据库事务隔离级别为读未提交、读提交和可重复读的情况下会出现,而在DM中可重复读的数据库事务隔离级别升级为了更严格的串行化隔离级别,因此在DM中幻像读只会在数据库隔离级别为读未提交和读提交的情况下出现。
二、事务隔离级别
DM 数据库支持三种事务隔离级别:读未提交、读提交和串行化。
2.1读未提交隔离级
读未提交隔离级别是最不严格的隔离级别。实际上,在使用这个隔离级别时,有可能发生脏读、不可重复读和幻像读。一般来说,读未提交隔离级别通常只用于访问只读表和只读视图,以消除可见性判断带来的系统开销,提升查询性能。
用户可以在事务开始时使用以下语句,设定事务为读未提交隔离级:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
例:
在事务执行前设置事务的隔离级别为读未提交:新建一个查询会话窗口1,建表test_iso2并插入数据:
set transaction isolation level read uncommitted