文件首頁
X DevAPI 使用者指南
下載本手冊
PDF (US Ltr) - 1.4Mb
PDF (A4) - 1.4Mb


X DevAPI 使用者指南  /  語句執行  /  使用儲存點

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 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

例如,考量以下沒有明確 BEGINsession.startTransaction() 或類似呼叫的語句

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

如果伺服器上啟用 autocommit 模式,則這些語句會導致錯誤,因為名為 testsavepoint 的儲存點不存在。這是因為呼叫 session.setSavepoint() 會建立交易,然後建立儲存點並直接提交。結果是當呼叫 releaseSavepoint() 時,儲存點不存在,而是位於其自己的交易中。在這種情況下,若要讓儲存點繼續存在,您需要先啟動明確的交易區塊。