AnalyticDB PostgreSQL版支持标准数据库事务ACID属性,提供了三种隔离级别。AnalyticDB PostgreSQL版为分布式MPP架构,支持节点水平扩展,同时保证节点间事务的强一致属性。本文介绍AnalyticDB PostgreSQL版的事务隔离级别及事务的相关操作。

隔离级别

AnalyticDB PostgreSQL版支持以下三种事务隔离级别,默认为读已提交(READ COMMITTED)。

  • 读未提交(READ UNCOMMITTED):SQL标准中的脏读(READ UNCOMMITTED )语法定义,但实际按读已提交(READ COMMITTED)执行。
  • 读已提交(READ COMMITTED):SQL标准中的读已提交(READ COMMITTED)语法定义,按读已提交(READ COMMITTED)级别执行。
  • 可序列化(SERIALIZABLE):SQL标准中的可序列化(SERIALIZABLE)语法定义,但实际按可重复读(REPEATABLE READ)级别执行。
说明 AnalyticDB PostgreSQL版Serverless模式目前仅支持读已提交级别。

示例:

使用可序列化(SERIALIZABLE)隔离级别开始事务块:
BEGIN TRANSACTION ISOLATION LEVEL SERIALIZABLE;
BEGIN;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

AnalyticDB PostgreSQL版提供了下列事务管理相关的SQL命令:

  • BEGIN或者START TRANSACTION 开始一个事务块。
  • END或者COMMIT提交一个事务的结果。
  • ROLLBACK放弃一个事务而不做任何更改。
  • SAVEPOINT在一个事务中标记一个位置并且允许做部分回滚。用户可以回滚在一个保存点之后执行的命令但保留该保存点之前执行的命令。
  • ROLLBACK TO SAVEPOINT 回滚一个事务到一个保存点。
  • RELEASE SAVEPOINT 销毁一个事务内的保存点。

示例:

在事务中建立一个保存点,后来撤销在它建立之后执行的所有命令的效果:
BEGIN;
    INSERT INTO table1 VALUES (1);
    SAVEPOINT my_savepoint;
    INSERT INTO table1 VALUES (2);
    ROLLBACK TO SAVEPOINT my_savepoint;
    INSERT INTO table1 VALUES (3);
COMMIT;

上面的事务将插入值1和3,但不会插入2。

要建立并且稍后销毁一个保存点:
BEGIN;
    INSERT INTO table1 VALUES (3);
    SAVEPOINT my_savepoint;
    INSERT INTO table1 VALUES (4);
    RELEASE SAVEPOINT my_savepoint;
COMMIT;

上面的事务将插入值3和4。