Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - SQL 的用法 » 创建数据库 » 使用事务和隔离级别 » 隔离级别和一致性 » 从支持 ODBC 的应用程序设置隔离级别

 

在事务内更改隔离级别

不同的隔离级别可能适合于一个事务的不同部分。SQL Anywhere 支持在事务中间更改数据库的隔离级别。

如果在事务中间更改了 isolation_level 选项,新设置只会影响以下对象:

  • 任何在更改后打开的游标

  • 任何在更改后执行的语句

您可能希望在事务处理过程中更改隔离级别,以控制事务放置的锁数量。有的事务可能需要读取一个大型表,但却仅对其中少数几行执行具体的操作。如果不一致对该事务不会产生严重影响,则可以在扫描该大型表时设置较低的隔离级别,以避免延迟其它事务的操作。

在其它一些情况下,您也可能希望在事务中间更改隔离级别,例如,在只有一个表或一组表需要序列化访问时。

有关在事务中间更改隔离级别的示例,请参见教程:幻像行

注意

您也可以使用表提示设置隔离级别(仅限于级别 0-3),但是这是一个高级功能,只应在需要时使用它。有关详细信息,请参见FROM 子句中的 WITH table-hint 一节。

使用快照隔离时更改隔离级别

使用快照隔离时,您可以在事务内更改隔离级别。可以通过更改 isolation_level 选项的设置,或通过使用影响查询中隔离级别的表提示,来完成此操作。可以随时使用语句快照、只读语句快照和隔离级别 0-3。但是,如果快照隔离级别在快照之外的隔离级别上开始,则您无法在事务中使用该快照隔离级别。事务由更新启动并继续执行,直到下一个 COMMIT 或 ROLLBACK。如果在快照之外的某个隔离级别上发生第一次更新,那么在事务提交或回退之前,尝试使用快照隔离级别的任何语句都会返回错误 -1065 NON_SNAPSHOT_TRANSACTION。例如:

SET OPTION PUBLIC.allow_snapshot_isolation = 'On';

BEGIN TRANSACTION
    SET OPTION isolation_level = 3;
    INSERT INTO Departments
        ( DepartmentID, DepartmentName, DepartmentHeadID )
        VALUES( 700, 'Foreign Sales', 129 );
    SET TEMPORARY OPTION isolation_level = 'snapshot';
    SELECT * FROM Departments;