X DevAPI 用户指南  / 第 8 章语句执行  /  8.2 使用保存点

8.2 使用保存点

X DevAPI 支持保存点,它使您能够在可以恢复的事务中设置命名点。通过在事务中设置保存点,您以后可以使用回滚功能撤消设置保存点后发出的任何语句。如果您不再需要保存点,可以将其释放。本节介绍如何在 X DevAPI 中使用保存点。有关SAVEPOINT背景信息,请参阅。

设置保存点

保存点由字符串名称标识。该字符串可以包含标识符允许的任何字符。要创建保存点,请使用session.setSavepoint() 映射到 SQL 语句的操作 。如果您不指定 a ,则会自动生成一个。例如通过发布: SAVEPOINT name;name

session.setSavepoint()

使用自动生成的名称创建事务保存点,并返回包含保存点名称的字符串。此名称可与 session.rollbackTo()session.releaseSavepoint()操作一起使用。该 session.setSavepoint()操作可以在一个会话中多次调用,每次都会生成一个唯一的保存点名称。

也可以通过传入字符串来手动定义保存点的​​名称name。例如发行:

session.setSavepoint('name')

生成具有指定 的事务保存点,该保存点 name由操作作为字符串返回。 可以通过这种方式多次调用 该 操作,如果已经用于一个保存点,则删除之前的保存点并设置一个新的保存点。 session.setSavepoint('name')name

回滚到保存点

当会话具有事务保存点时,您可以使用 session.rollbackTo()映射到ROLLBACK TO name语句的操作撤消任何后续事务。例如,发出:

session.rollbackTo('name')

回滚到事务保存点 name。只要给定的保存点尚未释放,此操作就会成功。回滚到在其他保存点之前创建的保存点会导致后续保存点被释放或回滚。例如:

session.startTransaction()
(some data modifications occur...)

session.setSavepoint('point1')     <---- succeeds
(some data modifications occur...)

session.setSavepoint('point2')     <---- succeeds
(some data modifications occur...)

session.rollbackTo('point1')       <---- succeeds
session.rollbackTo('point1')       <---- still succeeds, but position stays the same
session.rollbackTo('point2')       <---- generates an error because lines above already cleared point2
session.rollbackTo('point1')       <---- still succeeds

释放保存点

要取消一个保存点,例如当不再需要它时,使用releaseSavepoint()并传入要释放的保存点的名称。例如,发出:

session.releaseSavepoint('name')

释放保存点name

保存点和隐式事务行为

保存点的确切行为由服务器定义,特别是如何配置自动提交。请参阅 自动提交、提交和回滚

例如,考虑以下没有显式 BEGIN调用 session.startTransaction()或类似调用的语句:

session.setSavepoint('testsavepoint');
session.releaseSavepoint('testsavepoint');

如果在服务器上启用了自动提交模式,这些语句会导致错误,因为指定的保存点 testsavepoint不存在。这是因为调用session.setSavepoint()创建一个事务,然后是保存点并直接提交它。结果是发出调用时保存点不存在, releaseSavepoint()而是在它自己的事务中。在这种情况下,为了让保存点继续存在,您需要先启动一个显式事务块。