SET TRANSACTION
功能描述
为事务设置特性。事务特性包括事务隔离级别、事务访问模式(读/写或者只读)。可以设置当前事务的特性(LOCAL),也可以设置会话的默认事务特性(SESSION)。
注意事项
设置当前事务特性需要在事务中执行(即执行SET TRANSACTION之前需要执行START TRANSACTION或者BEGIN,否则设置不生效。
语法格式
设置事务的隔离级别、读写模式。
{ SET [ LOCAL ] TRANSACTION|SET SESSION CHARACTERISTICS AS TRANSACTION } { ISOLATION LEVEL { READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE | REPEATABLE READ } { READ WRITE | READ ONLY } } [, ...]
设置事务共享它当时的snapshot给其他的事务使用。
SET TRANSACTION SNAPSHOT snapshot_id;
SET TRANSACTION SNAPSHOT
命令允许新的事务使用与一个现有事务相同的快照运行。已经存在的事务必须已经把它的快照用pg_export_snapshot函数导出。该函数会返回一个快照标识符,SET TRANSACTION SNAPSHOT需要被给定一个快照标识符来指定要导入的快照。只有事务是SERIALIZABLE以及 repeatable read时,DEFERRABLE 事务属性才会有效。
参数说明
LOCAL
声明该命令只在当前事务中有效。
SESSION
声明这个命令只对当前会话起作用。
取值范围:字符串,要符合标识符的命名规范。
READ WRITE | READ ONLY
指定事务访问模式。
取值范围:
- READ WRITE:读/写。
- READ ONLY:只读。
ISOLATION_LEVEL
指定事务隔离级别,该参数决定当一个事务中存在其他并发运行事务时能够看到什么数据。
在事务中第一个数据修改语句(SELECT、INSERT、DELETE、UPDATE、FETCH、COPY)执行之后,当前事务的隔离级别就不能再次设置。
取值范围:
- READ COMMITTED:读已提交隔离级别,只能读到已经提交的数据,而不会读到未提交的数据。这是缺省值。
- READ UNCOMMITTED:读未提交隔离级别,也就是说事务所作的修改在未提交前,其他并发事务是可以读到的。
- REPEATABLE READ:可重复读隔离级别,仅仅能看到事务开始之前提交的数据,不能看到未提交的数据,以及在事务执行期间由其它并发事务提交的修改。
- SERIALIZABLE:Vastbase目前功能上不支持此隔离级别,等价于REPEATABLE READ。
snapshot_id
快照标识符。用pg_export_snapshot函数导出。该函数会返回一个快照标识符,SET TRANSACTION SNAPSHOT需要被给定一个快照标识符来指定要导入的快照。
示例
示例1:设置事务的隔离级别、读写模式。
开启一个事务,设置事务的隔离级别为READ COMMITTED,访问模式为READ ONLY。
START TRANSACTION; SET LOCAL TRANSACTION ISOLATION LEVEL READ COMMITTED READ ONLY; COMMIT;
示例2:设置事务共享它当时的snapshot给其他的事务使用。
1、创建测试表并插入数据。
create table test (id int); insert into test values (1),(2);
2、会话1:设置事务隔离级别是repeatable read。
begin TRANSACTION ISOLATION LEVEL repeatable read;
3、会话1:使用pg_export_snapshot()函数保存当前的快照并返回一个文本字符串标识此快照。
SELECT pg_export_snapshot();
返回结果为:
pg_export_snapshot -------------------- 0000000000003807-1 (1 row)
4、会话1:向表中插入一条数据,再次执行pg_export_snapshot()函数保存当前的快照并返回一个文本字符串标识此快照。
insert into test values (3); SELECT pg_export_snapshot();
返回结果为:
pg_export_snapshot -------------------- 0000000000003807-2 (1 row)
5、会话1:使用txid_current()函数和txid_current_snapshot()函数获取当前事务id及快照id。
select * from txid_current(); select * from txid_current_snapshot();
返回结果分别为:
txid_current -------------- 14343 (1 row) txid_current_snapshot ----------------------- 14343:14343: (1 row)
6、会话2:插入一条数据。
insert into test values (4);
7、会话3:查询数据可以看到会话2中插入的数据。
select * from test;
返回结果为:
id ---- 1 2 4 (3 rows)
8、会话4:设置事务隔离级别是repeatable read。
begin TRANSACTION ISOLATION LEVEL repeatable read;
9、会话4:导入会话1的第一个snapshot,即步骤3中查询到的snapshot。
SET TRANSACTION SNAPSHOT '0000000000003807-1';
10、会话4:查询表中数据(由于导入的snapshot为会话1的,因此查询不到会话2中提交的数据)。
select * from test;
返回结果为:
id ---- 1 2 (2 rows)
11、会话4:使用txid_current()函数和txid_current_snapshot()函数获取当前事务id及快照id。
select * from txid_current(); select * from txid_current_snapshot();
返回结果分别为:
txid_current -------------- 14345 (1 row) txid_current_snapshot ----------------------- 14343:14343: (1 row)