键集驱动的游标

键集驱动的游标位于静态游标和动态游标之间,能够检测更改。 与静态游标一样,它并不总是检测结果集成员资格和顺序的更改。 就像动态游标一样,它会检测结果集中行值的更改(这一点受事务隔离级别的限制,该级别由 SQL_ATTR_TXN_ISOLATION 连接属性设置)。

打开键集驱动的游标时,它将保存整个结果集的键;这将修复结果集的明显成员身份和顺序。 当游标滚动浏览结果集时,它使用此 键集中 的键检索每行的当前数据值。 例如,假设键集驱动的游标提取行,然后另一个应用程序更新该行。 如果游标重新提取该行,那么它看到的值是更新后的值,因为它使用其键来重新提取该行。 因此,由键集驱动的游标始终检测由自己和他人所做的更改。

当游标尝试检索已删除的行时,此行在结果集中显示为“洞”:该行的键存在于键集中,但结果集中不再存在该行。 如果更新一行中的键值,则认为该行已被删除并重新插入,因此此类行在结果集中也会显示为空洞。 虽然键集驱动的游标始终可以检测到其他人删除的行,但它也可以选择性地从键集中删除自己删除的行对应的键。 执行此操作的键集驱动游标无法检测到自身的删除。 特定键集驱动的游标是否能够通过 SQLGetInfo 中的 SQL_STATIC_SENSITIVITY 选项,报告其自己的删除。

其他人插入的行永远不会对键集驱动的游标可见,因为键集中不存在这些行的键。 但是,键集驱动的游标可以选择将它自身插入的行的键添加到键集中。 进行此操作的钥集驱动游标可以检测其自身的插入。 特定键集驱动的游标是否能检测到自身的插入操作,是通过 SQLGetInfo 中的 SQL_STATIC_SENSITIVITY 选项来报告的。

由 SQL_ATTR_ROW_STATUS_PTR 语句属性指定的行状态数组可以包含任何行的SQL_ROW_SUCCESS、SQL_ROW_SUCCESS_WITH_INFO或SQL_ROW_ERROR。 对于检测到更新、删除或插入的行,它返回SQL_ROW_UPDATED、SQL_ROW_DELETED或SQL_ROW_ADDED。

键集驱动的游标通常通过创建一个临时表来实现,该临时表包含结果集中每一行的键。 由于游标还必须确定行是否已更新,因此此表通常还包含包含行版本控制信息的列。

若要滚动到原始结果集,键集驱动的游标将在临时表上打开静态游标。 若要检索原始结果集中的行,游标首先从临时表中检索相应的键,然后检索该行的当前值。 如果使用块游标,游标必须检索多个键和行。