不同的隔离级别可能适合于一个事务的不同部分。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; |
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |