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 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')
會釋放儲存點 名稱
。
儲存點的確切行為由伺服器定義,特別是 autocommit 的設定方式。請參閱 autocommit、Commit 和 Rollback。
例如,考量以下沒有明確 BEGIN
、session.startTransaction()
或類似呼叫的語句
session.setSavepoint('testsavepoint');
session.releaseSavepoint('testsavepoint');
如果伺服器上啟用 autocommit 模式,則這些語句會導致錯誤,因為名為 testsavepoint
的儲存點不存在。這是因為呼叫 session.setSavepoint()
會建立交易,然後建立儲存點並直接提交。結果是當呼叫 releaseSavepoint()
時,儲存點不存在,而是位於其自己的交易中。在這種情況下,若要讓儲存點繼續存在,您需要先啟動明確的交易區塊。