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 Anywhere 编程简介 » 在应用程序中使用 SQL » 使用游标

 

了解可更新语句

本节介绍 SELECT 语句中的子句如何影响可更新语句和游标。

只读语句的可更新性

在游标声明中指定 FOR READ ONLY 或在语句中包含 FOR READ ONLY 子句可使语句为只读语句。换句话说,FOR READ ONLY 子句或使用客户端 API 时适当的只读游标声明会覆盖任何其它可更新性说明。

如果 SELECT 语句的最外层块中包含 ORDER BY 子句且该语句未指定 FOR UPDATE,则游标为 READ ONLY。如果 SQL SELECT 语句指定 FOR XML,则游标为 READ ONLY。否则,游标是可更新的。

可更新语句和并发控制

对于可更新语句,SQL Anywhere 提供了优化和保守两种游标并发控制机制,以便确保滚动操作中结果集保持一致。虽然这两种机制各有各的语义和利弊,它们都可作为使用 INSENSITIVE 游标或快照隔离的替代方法。

FOR UPDATE 的说明可影响游标是否可更新。然而,在 SQL Anywhere 中,FOR UPDATE 语法对并发控制没有任何其它影响。如果使用其它参数指定 FOR UPDATE,SQL Anywhere 将按如下方式变更语句的处理过程,以合并两个并发控制选项之一:

  • 保守   对于在游标的结果集中读取的所有行,数据库服务器将获得意图行锁,以防止任何其它事务更新这些行。

  • 优化   数据库服务器使用的游标类型更改为由键集决定的游标(对行成员资格不敏感,对值敏感),以便在此事务或任何其它事务修改或删除结果中的行时通知应用程序。

通过带有 DECLARE CURSOR 或 FOR 语句的选项,或特定编程接口的并发设置 API,可在游标级别指定保守或优化并发。如果语句是可更新的,而游标未指定并发控制机制,则使用语句的说明。语法如下:

  • FOR UPDATE BY LOCK   数据库服务器在结果集的读取行上获得意图行锁。这些锁是长期锁,会一直保留到事务 COMMIT 或 ROLLBACK 执行。

  • FOR UPDATE BY { VALUES | TIMESTAMP }   数据库服务器通过利用键集决定的游标,这样,如果在滚动结果集过程中修改或删除了行,则会通过该游标通知应用程序。

有关详细信息,请参见DECLARE 语句FOR 语句

限制可更新语句

FOR UPDATE (column-list) 强制实行以下限制:在随后的 UPDATE WHERE CURRENT OF 语句中只能修改指定的结果集属性。