8.2 使用保存点

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

设置保存点

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

session.setSavepoint()

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

您也可以通过传入字符串 名称 来手动定义保存点的名称。例如,发出

session.setSavepoint('name')

将使用指定的 名称 创建一个事务保存点,该名称由操作作为字符串返回。可以以这种方式多次调用 session.setSavepoint('名称') 操作,如果 名称 已被用于保存点,则先前的保存点将被删除并设置一个新的保存点。

回滚到保存点

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

session.rollbackTo('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')

将释放保存点 名称

保存点和隐式事务行为

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

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

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

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