此示例使用一个简单查询来阐释这样的情形:删除结果集中的某一行后,不同的游标会如何响应。
请看以下事件序列:
某个应用程序在以下针对示例数据库的查询中打开一个游标。
SELECT EmployeeID, Surname FROM Employees ORDER BY EmployeeID; |
EmployeeID | Surname |
---|---|
102 | Whitney |
105 | Cobb |
160 | Breault |
... | ... |
应用程序通过游标读取第一行 (102)。
应用程序通过游标读取下一行 (105)。
另外一个事务删除了 102 号雇员(Whitney) 并提交了更改。
在此情况下游标操作的结果取决于游标敏感性:
不敏感游标 在通过游标所看到的结果的成员资格中或值中,不反映这一 DELETE:
操作 | 结果 |
---|---|
读取前一行 | 返回该行的原始副本 (102)。 |
读取第一行(绝对读取) | 返回该行的原始副本 (102)。 |
读取第二行(绝对读取) | 返回未更改的行 (105)。 |
敏感游标 结果集的成员资格已经更改,因此,行 105 现在是结果集中的第一行:
操作 | 结果 |
---|---|
读取前一行 | 返回 [未找到行 ]。没有前一行。
|
读取第一行(绝对读取) | 返回行 105。 |
读取第二行(绝对读取) | 返回行 160。 |
对值敏感的游标 结果集的成员资格是固定的,因此行 105 仍是结果集的第二行。DELETE 反映在游标的值中,并在结果集中创建了一个有效洞。
操作 | 结果 |
---|---|
读取前一行 | 返回 [没有当前的游标行 ]。在游标中过去曾经是第一行的地方有一个洞。
|
读取第一行(绝对读取) | 返回 [没有当前的游标行 ]。在游标中过去曾经是第一行的地方有一个洞。
|
读取第二行(绝对读取) | 返回行 105。 |
敏感性未定型游标 对于更改,结果集的成员资格和值是不确定的。读取前一行、第一行或第二行的响应取决于查询的特定优化方法:该方法是否涉及工作表的构造,另外,所读取的行是否已从客户端预读。
敏感性未定型游标的优点是,对于许多应用程序,敏感性是不重要的。特别是,如果您要使用只进、只读游标,将不会看到基础更改。此外,如果您在高隔离级别运行,那么将不允许基础更改。
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2013, SAP 股份公司或其关联公司. - SAP Sybase SQL Anywhere 16.0 |