START TRANSACTION

说明

开始一个事务

语法

start_transaction ::=

iso ::=

access_mode ::=

参数

iso

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

默认为READ COMMITTED

注解

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

access_mode

  • READ ONLY表示开始一个只读事务。
  • READ WRITE表示开始一个可读写事务。

默认为READ WRITE

注解

如果当前已经在一个事务中了,语句 START TRANSACTION; 将导致出错。

当没有申明 READ ONLY 和 READ WRITE 时,在不同的情况下采取不同的默认值:当数据库只读、或当前 session 只读、或当前 session 的隔离级别为 READ UNCOMMITTED 时,开始的事务将是只读的。否则开始的时候就是可读写的。如果数据库只读、或当前 session 只读、或当前 session 的隔离级别为 READ UNCOMMITTED 时,申明 READ WRITE 将导致出错,开始事务失败。

当开始一个事务之后,执行其他语句之前,可以使用 SET TRANSACTION 语句再次设置事务的读写属性和隔离级别。一旦执行过其他 DML 或 DDL 语句,表示事务被激活,再次使用 SET TRANSACTION 设置事务属性将失败。

示例

示例1: 开始一个事务

--  清理环境
DROP TABLE tab1 CASCADE;

--  创建表并插入数据
CREATE TABLE tab1(a INT);

INSERT INTO tab1 VALUES(1);
INSERT INTO tab1 VALUES(2);


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


--  开始一个事务
START TRANSACTION;

--  事务中插入数据
INSERT INTO tab1 VALUES(3);


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

--  回滚事务
ROLLBACK;


--  事务中插入数据已不存在
SELECT * FROM tab1 ORDER BY a;
A(int)      |
------------
1           |
------------
2           |
总数目:2


--  删除表
DROP TABLE tab1;

示例2: 开始一个只读事务

--  清理环境
DROP TABLE tab2 CASCADE;

--  创建表并插入数据
CREATE TABLE tab2(a INT);

INSERT INTO tab2 VALUES(1);
INSERT INTO tab2 VALUES(2);


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


--  开始一个只读事务
START TRANSACTION READ ONLY;

--  只读事务中插入数据,插入失败
INSERT INTO tab2 VALUES(3);
ERROR, 事务只读,该语句出错(INSERT INTO tab2 VALUES(3))


--  提交事务
COMMIT;


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


--  删除表
DROP TABLE tab2;

示例3: 开始一个事务(指定隔离级别)

--  清理环境
DROP TABLE tab3 CASCADE;

--  创建表并插入数据
CREATE TABLE tab3(a INT);

INSERT INTO tab3 VALUES(1);
INSERT INTO tab3 VALUES(2);


SELECT * FROM tab3 ORDER BY a;
A(int)      |
------------
1           |
------------
2           |
总数目:2


--  开始一个事务(指定隔离级别)
START TRANSACTION ISOLATION LEVEL REPEATABLE READ;

--  事务中插入数据
INSERT INTO tab3 VALUES(3);


SELECT * FROM tab3 ORDER BY a;
A(int)      |
------------
1           |
------------
2           |
------------
3           |
总数目:3


--  回滚事务
ROLLBACK;


SELECT * FROM tab3 ORDER BY a;
A(int)      |
------------
1           |
------------
2           |
总数目:2


--  删除表
DROP TABLE tab3;

示例4: 开始一个事务(修改事务属性)

--  清理环境
DROP TABLE tab4 CASCADE;

--  创建表并插入数据
CREATE TABLE tab4(a INT);

INSERT INTO tab4 VALUES(1);
INSERT INTO tab4 VALUES(2);


SELECT * FROM tab4 ORDER BY a;
A(int)      |
------------
1           |
------------
2           |
总数目:2


--  开始一个事务
START TRANSACTION;

--  修改事务属性 —— 只读
SET TRANSACTION READ ONLY;

--  只读事务中插入数据,插入失败
INSERT INTO tab4 VALUES(3);
ERROR, 事务只读,该语句出错(INSERT INTO tab4 VALUES(3))


--  回滚事务
ROLLBACK;


SELECT * FROM tab4 ORDER BY a;
A(int)      |
------------
1           |
------------
2           |
总数目:2


--  删除表
DROP TABLE tab4;