X DevAPI 支援儲存點,這讓您可以在交易內設定一個具名的點,以便還原至該點。透過在交易內設定儲存點,您之後可以使用回滾功能,取消在設定儲存點之後發出的任何陳述式。如果不再需要儲存點,則可以釋放它們。本節說明如何在 X DevAPI 中使用儲存點。如需背景資訊,請參閱SAVEPOINT
。
儲存點以字串名稱識別。字串可以包含任何允許用於識別符號的字元。若要建立儲存點,請使用 session.setSavepoint()
操作,這會對應到 SQL 陳述式 SAVEPOINT
。如果您未指定 名稱
;name
,則會自動產生一個。例如,發出
session.setSavepoint()
會建立一個具有自動產生名稱的交易儲存點,並傳回一個包含儲存點名稱的字串。此名稱可以與 session.rollbackTo()
或 session.releaseSavepoint()
操作搭配使用。session.setSavepoint()
操作可以在工作階段中多次呼叫,而且每次都會產生唯一的儲存點名稱。
也可以透過傳入字串 名稱
來手動定義儲存點的名稱。例如,發出
session.setSavepoint('name')
會產生一個具有指定 名稱
的交易儲存點,該名稱會由操作以字串形式傳回。session.setSavepoint('
操作可以這種方式多次呼叫,如果 名稱
')名稱
已用於儲存點,則會刪除先前的儲存點,並設定新的儲存點。
當工作階段具有交易儲存點時,您可以使用 session.rollbackTo()
操作取消任何後續交易,該操作會對應到 ROLLBACK TO name
陳述式。例如,發出
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')
會釋放儲存點 名稱
。
儲存點的確切行為是由伺服器定義,特別是自動認可的設定方式。請參閱自動認可、認可與回滾。
例如,請考慮下列陳述式,不含明確的 BEGIN
、session.startTransaction()
或類似的呼叫
session.setSavepoint('testsavepoint');
session.releaseSavepoint('testsavepoint');
如果伺服器上已啟用自動認可模式,則這些陳述式會導致錯誤,因為名為 testsavepoint
的儲存點不存在。這是因為呼叫 session.setSavepoint()
會建立交易,然後建立儲存點並直接認可。結果是當發出 releaseSavepoint()
的呼叫時,儲存點不存在,而是處於自己的交易中。在這種情況下,為了讓儲存點繼續存在,您需要先啟動明確的交易區塊。