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

SAP Sybase SQL Anywhere 16.0 (中文) » SQL Anywhere 服务器 - SQL 用法 » 事务和隔离级别 » 隔离级别和一致性

 

快照隔离

多个用户同时读取和写入相同数据时,可能发生阻塞和死锁。快照隔离旨在通过维护数据的不同版本提高并发性和一致性。在事务中使用快照隔离时,数据库服务器会返回数据的已提交版本,以响应任何读请求。它在进行此操作时不获取读锁定,因此不会对正在写入数据的用户造成干扰。

快照是数据库中已提交的一组数据。使用快照隔离时,事务中的所有查询都会使用同一组数据。数据库表不会获取任何锁,因此其它事务可以无阻塞地访问并修改数据。SQL Anywhere 支持以下三种快照隔离级别,允许您控制何时使用快照:

  • 快照   从事务读取、插入、更新或删除第一行时开始,使用已提交数据的快照。

  • 语句快照   从语句读取第一行开始,使用已提交数据的快照。事务内的每个语句看到的都是不同时间的数据快照。

  • 只读语句快照   对于只读语句,从读取第一行时开始,使用已提交数据的快照。事务内的每个只读语句看到的都是不同时间的数据快照。对于插入、更新和删除语句,使用由 updatable_statement_isolation 选项指定的隔离级别(可以是 0(缺省值)、1、2 或 3)。

您还可以使用 BEGIN SNAPSHOT 语句,指定何时启动事务的快照。

快照隔离在许多情况下都很有用,例如:

  • 执行大量读取操作和很少更新操作的应用程序   快照事务仅为那些修改数据库的语句获取写锁定。如果事务主要执行读取操作,则快照事务不会获取可能干扰其他用户的事务的读锁定。

  • 其他用户需要访问数据时执行长时间运行的事务的应用程序   快照事务不获取读锁定,因此快照事务发生时,其他用户可以读取和更新数据。

  • 必须从数据库读取一致的数据集的应用程序   快照显示特定时间点的已提交数据集,因此您可以使用快照隔离来查看在整个事务中未更改的一致数据,即使其他用户在您的事务运行时对数据进行更改。

快照隔离仅影响所有用户共享的基表和全局临时表。对其它表类型的读取操作决不会看到数据的旧版本,且从不启动快照。仅当将 isolation_level 选项设置为快照,且更新启动一个事务时,对其它表类型的更新才启动快照。

当存在使用 WITH HOLD 子句打开的使用语句或事务快照的游标时,以下语句无法执行。

当使用 WITH HOLD 子句打开游标时,可看到在快照启动时所提交的所有行的快照。还可看到从在其内打开游标的事务启动以来,由当前连接完成的所有修改。

仅当未执行快速截断时允许执行 TRUNCATE TABLE,因为在此情况下,单独的 DELETE 操作随后会被记录在事务日志中。

此外,如果从非快照事务中执行这些语句中的任何语句,则已运行的快照事务在随后尝试使用表时,会返回一条错误,指示模式已更改。

如果视图在事务的快照开始后进行刷新,则实例化视图匹配将避免使用该视图。

所有编程接口都支持快照隔离级别。可以使用 SET OPTION 语句设置隔离级别。有关使用快照隔离的信息,请参见快照隔离

 行版本
 了解快照事务
 另请参见

如何启用快照隔离
快照隔离示例
更新冲突和快照隔离