GaussDB(DWS)事务隔离级别简介

前言

关系型数据库对于并发的控制一般可通过三方面实现:多版本(MVCC)、锁机制、事务的隔离级别,备份主要介绍事务隔离级别,以及相关的操作。

事务隔离级别

读未提交(Read Uncommitted

事务A中只要更新了记录,不需要等到事务A提交,事务B中select查询也能读到更新后的数据,这属于脏读,即:一个事务读取了另一个未提交的并行事务写的数据。可能会出现幻读,即:同一事务中,同一个查询语句,结果不一致。

读已提交(Read Committed

当事务A运行在这个隔离级别时,select查询只能看到其他已经提交事务的修改记录,不会出现脏读。但是select查询看到一个在查询运行的瞬间的数据库的一个快照,select看得见其自身所在事务中之前的更新的执行结果,即使它们尚未提交,这属于不可重复读,即:一个事务重新读取前面读取过的数据, 发现该数据已经被另一个已提交的事务修改过。可能会出现幻读。

可重复读(Repeatable Read)

即使数据被其他事物修改, 当前事务也不会读取到新的数据。

该隔离级别下,事务内的select查询能看到事务开始时的快照,而不是事务内部select查询开始时刻的快照,这样同一个事务内部,select查询结果总是相同的,不会出现脏读,可重复读,可能会出现幻读。

可串行化(Serializable)

可串行化是最严格的事务隔离级别。不会脏读、可重复读、不会幻读。

可串行化是一个调度,即多个事务之间的执行方式,而多个事务之间的执行有个先后顺序。如果事务之间没有共同的操作对象(读或写操作),则事务之间的执行顺序前后置换是没有关系的,但是如果事物间存在共同的操作对象,则事务间先后执行的顺序则需要区分。对于存在共同操作对象的多个并发执行的事务,如果其执行结果“等价”于某个“串行化调度”,则这个调度才是“可串行化的调度”。满足“可串行化的调度”则具有了可串行化属性。所以,可串行化属性保证的是多个事务并发时的执行顺序要对数据的一致性没有影响。

综上所述,整理表格如下:

隔离级别 脏读 不可重复读 幻读 GaussDB(DWS)支持情况
读未提交 可能 可能 可能 不支持,如果设置该级别,等价于读已提交
读已提交 不可能  可能 可能 支持,缺省值
可重复读 不可能 不可能 可能 支持
可串行化 不可能 不可能 不可能 不支持,如果设置该级别,等价于可重复读


如何设置事务隔离级别

方式一:全局生效,设置guc参数,下面***表示隔离级别,取值范围:read committed、read uncommitted、repeatable read、serializable

gs_guc reload -Z coordinator -Z datanode -N all -I all -c "default_transaction_isolation=***"

方式二:会话级生效,取值范围:read committed、read uncommitted、repeatable read、serializable

START TRANSACTION ISOLATION LEVEL READ COMMITTED READ WRITE;
SELECT * FROM test;
COMMIT;
START TRANSACTION;
SET LOCAL TRANSACTION ISOLATION LEVEL READ COMMITTED READ ONLY;
SELECT * FROM test;
COMMIT;

GaussDB(DWS)博文后缀.png

(完)