8.2 使用儲存點

X DevAPI 支援儲存點,讓您可以在交易中設定一個具名的點,以便還原至該點。藉由在交易中設定儲存點,您稍後可以使用回滾功能來取消在設定儲存點之後發出的任何陳述式。如果您不再需要儲存點,可以釋放它們。本節說明如何在 X DevAPI 中使用儲存點。如需背景資訊,請參閱 SAVEPOINT

設定儲存點

儲存點以字串名稱識別。字串可以包含識別碼允許的任何字元。若要建立儲存點,請使用 session.setSavepoint() 作業,該作業對應至 SQL 陳述式 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

儲存點和隱含交易行為

儲存點的確切行為由伺服器定義,特別是自動提交的設定方式。請參閱 自動提交、提交和回滾

例如,請考慮以下陳述式,沒有明確的 BEGINsession.startTransaction() 或類似的呼叫

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

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