OceanBase SAVEPOINT

2021-06-29 14:31 更新

描述

?SAVEPOINT?語句用來實現(xiàn)事務的部分回滾。

格式

  • 創(chuàng)建?SAVEPOINT?:
SAVEPOINT spname
  • 回滾到?SAVEPOINT?:
ROLLBACK [WORK] to [SAVEPOINT] spname

參數(shù)說明

參數(shù)

描述

spname

指定SAVEPOINT的名稱SAVEPOINT是事務范圍內唯一的,一個SAVEPOINT會覆蓋前一個同名的SAVEPOINT。創(chuàng)建SAVEPOINT后可以將事務回滾到指定SAVEPOINT,也可以使用ROLLBACK語句回滾整個事務。

示例

假設一個事務執(zhí)行了如下語句:

sql_no

語句

分區(qū)

1

update...

p1, p4

savepoint sp1

2

update...

p2, p4

3

update...

p3, p5

savepoint sp2

4

update...

p1, p3, p6

5

update...

p1, p5

savepoint sp3

6

select...

7

update...

p5, p6

savepoint sp4

記錄 Savepoint

用戶在提交事務之前可以創(chuàng)建?SAVEPOINT?,需要根據?SAVEPOINT?創(chuàng)建的順序,將事務的?SAVEPOINT?串成鏈表。以上事務包含了 7 條 SQL 和 4 個?SAVEPOINT?,記錄?SAVEPOINT?的鏈表如下圖所示,其中每個節(jié)點記錄了?<spname, sql_no>?的映射關系:

OceanBase SAVEPOINT

事務參與者列表

事務為了支持回滾某條 SQL 之后的所有修改,需要將每條語句涉及的參與者以及對應的 ?sql_no? 記錄下來,以上事務執(zhí)行了 7 條 SQL,涉及 p1~p6 共 6 個分區(qū):

OceanBase SAVEPOINT

Savepoint 回滾過程

  1. 根據?SAVEPOINT?鏈表查詢?spname?對應的?sql_no?假設用戶執(zhí)行?ROLLBACK to SAVEPOINT sp2?,根據savepoint鏈表查詢到 sp2 對應的?sql_no?為 3。
  2. 根據事務參與者列表查詢?sql_no?對應的分區(qū)根據事務參與者列表查詢到?sql_no?大于 3 的語句操作的分區(qū)涉及 p1、p3、p5、p6。
  3. 回滾分區(qū)數(shù)據根據第 2 步查詢到的分區(qū),調度程序向這些分區(qū)發(fā)起回滾請求,回滾當前事務在這些分區(qū)上 sp2 之后的所有修改。其中 p1、p3、p5 上關于本事務的部分修改被回滾掉,p6 上關于本事務的所有修改都被回滾掉。
  4. 更新事務參與者列表信息修改事務參與者列表,將?sql_no?大于 3 的操作信息從事務參與者列表中刪除,由于 p6上的所有修改都被回滾掉,因此 p6 可以從參與者列表中刪除。
  5. OceanBase SAVEPOINT

  6. 刪除無效的 Savepoint用戶執(zhí)行?ROLLBACK to SAVEPOINT sp2?成功后,系統(tǒng)會刪除 sp3 和 sp4 的SAVEPOINT,不允許再回滾到 sp3 和 sp4。
  7. OceanBase SAVEPOINT

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號