对比 SET TRANSACTION 与 SET ISOLATION

SET TRANSACTION 语句符合 ANSI SQL-92。此语句类似于 GBase 8s SET ISOLATION 语句;然而,SET ISOLATION 语句不符合 ANSI 且不提供访问模式。实际上,您可以 SET TRANSACTION 语句设置的隔离级别与您可以 SET ISOLATION 语句设置的隔离级别极为相似,如下表所示。
SET TRANSACTION 隔离级别 SET ISOLATION 隔离级别
Read Uncommitted Dirty Read
Read Committed Committed Read
[不支持] Cursor Stability
(ANSI) Repeatable Read ( GBase 8s ) Repeatable Read
Serializable ( GBase 8s ) Repeatable Read

SET TRANSACTION 与 SET ISOLATION 之间的另一差异是在事务内的隔离级别的行为。对于事务您仅可发出 SET TRANSACTION 一次。在那个事务期间打开的任何游标都要保证那个隔离级别(或访问模式,如果您正在定义访问模式的话)。在启动事务之后,你可以 SET ISOLATION 在该事务内多次更改隔离级别。

下列示例展示 SET ISOLATION 与 SET TRANSACTION 语句在行为方面的这种差异:
EXEC SQL BEGIN WORK;
        EXEC SQL SET ISOLATION TO DIRTY READ;
        EXEC SQL SELECT ... ;
        EXEC SQL SET ISOLATION TO REPEATABLE READ;
        EXEC SQL INSERT ... ;
        EXEC SQL COMMIT WORK;    -- Executes without error
请将前一示例与这些 SET TRANSACTION 语句对比:
EXEC SQL BEGIN WORK;
        EXEC SQL SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
        EXEC SQL SELECT ... ;
        EXEC SQL SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
        -- Produces error 876: Cannot issue SET TRANSACTION
        -- in an active transaction.

SET ISOLATION 与 SET TRANSACTION 之间另一差异是隔离级别的持续时间。由于 SET ISOLATION 支持完整连接级别设置,因此通过 SET ISOLATION 指定的隔离级别保持生效,直到发出另一 SET ISOLATION 语句为止。通过 SET TRANSACTION 设置的隔离级别仅在事务终止之前保持生效。然后,隔离级别重置为数据库类型的缺省值。