SET TRANSACTION

说明

设置事务的读写属性或隔离级别

语法

set_transaction ::=

trans_opt ::=

access_mode ::=

iso ::=

参数

access_mode

  • READ ONLY设置当前事务只读。
  • READ WRITE设置当前事务可读写。

默认为READ WRITE

iso

  • READ UNCOMMITTED执行脏读或 0级隔离锁定,这表示不发出共享锁,也不接受排它锁。当设置该选项时,可以对数据执行未提交读或脏读;在事务结束前可以更改数据内的数值,元组也可以出现在数据集中或从数据集消失。这是四个隔离级别中限制最小的级别。
  • READ COMMITTED指定在读取数据时控制共享锁以避免脏读,但数据可在事务结束前更改,从而产生不可重复读取或幻像数据。
  • REPEATABLE READ锁定查询中使用的所有数据以防止其他用户更新数据,但是其他用户可以将新的幻像行插入数据集,且幻像行包括在当前事务的后续读取中。因为并发低于默认隔离级别,所以应只在必要时才使用该选项。
  • SERIALIZABLE在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。

默认为READ COMMITTED

注解

如果当前不在一个事务中,或者系统自动提交属性为假,或者事务已经被激活,SET TRANSACTION 语句将导致出错。

当 BEGIN; 或者由于自动提交为假时开始一个事务之后,以下情况不会导致事务被激活:1). 语法分析错;2). SET 语句、RESET 语句、SHOW 语句;3). 事务相关的语句(BEGIN、START、COMMIT、END、ROLLBACK、ABORT)。之后一旦执行过其他语句,事务就被激活,此时 SET TRANSACTION 将导致出错。

神通提供配置参数 ENABLE_DDL_SERIALIZE,默认值为 true,可以在任何隔离级别下仅让 ddl 语句实现 SERIALIZABLE 级别,改为 false 可关闭此功能。

示例

示例1: 设置事务的隔离级别、读写属性

--  清理环境
DROP TABLE tab1 CASCADE;


CREATE TABLE tab1 (a INT);

INSERT INTO tab1 VALUES(100);
INSERT INTO tab1 VALUES(200);


SELECT * FROM tab1 ORDER BY a;
A(int)      |
------------
100         |
------------
200         |
总数目:2

--  开启事务
BEGIN;

--  设置事务的隔离级别 —— SERIALIZABLE
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

--  设置事务读写属性 —— 只读
SET TRANSACTION READ ONLY;

--  只读事务中插入数据失败
INSERT INTO tab1 VALUES(300);
ERROR, 事务只读,该语句出错(INSERT INTO tab1 VALUES(300)),请检查配置参数 READ_WRITE_MODE、SESSION_READONLY、ALLOW_UPDATE_UNDER_RUC、TRANSACTION ISOLATION LEVEL


--  回滚事务
ROLLBACK;



SELECT * FROM tab1 ORDER BY a;
A(int)      |
------------
100         |
------------
200         |
总数目:2


--  删除表
DROP TABLE tab1;

示例2: 事务激活之后设置事务属性

--  清理环境
DROP TABLE tab2 CASCADE;


CREATE TABLE tab2 (a INT);

INSERT INTO tab2 VALUES(100);
INSERT INTO tab2 VALUES(200);


SELECT * FROM tab2 ORDER BY a;
A(int)      |
------------
100         |
------------
200         |
总数目:2

--  开启事务
BEGIN;


SELECT * FROM tab2 ORDER BY a;
A(int)      |
------------
100         |
------------
200         |
总数目:2

-- 事务已经被激活,不能再设置事务属性
SET TRANSACTION READ WRITE;
ERROR, 非法的事务状态(transaction already be active)


--  回滚事务
ROLLBACK;



SELECT * FROM tab2 ORDER BY a;
A(int)      |
------------
100         |
------------
200         |
总数目:2


--  删除表
DROP TABLE tab2;

示例3: 设置冲突的读写属性

--  开启事务
BEGIN;

--  设置事务的隔离级别 —— READ UNCOMMITTED
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

--  设置事务读写属性 —— 与隔离级别冲突
SET TRANSACTION READ WRITE;
ERROR, 设置事务属性失败(transaction isolation level is READ UNCOMMITTED, must be read only!)


--  回滚事务
ROLLBACK;