OceanBase SAVEPOINT

2021-06-11 15:35 更新

描述

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

格式

  1. 創(chuàng)建 savepoint:
  2. SAVEPOINT spname
  3. 回滾到 savepoint:
  4. ROLLBACK [WORK] to [SAVEPOINT] spname
  5. 刪除 savepoint:
  6. RELEASE SAVEPOINT spname

參數(shù)說明

  • spname:指定 savepoint 的名稱。savepoint 是事務(wù)范圍內(nèi)唯一的,一個 savepoint 會覆蓋前一個同名的 savepoint。創(chuàng)建 savepoint 后可以將事務(wù)回滾到指定 savepoint,也可以使用 ?ROLLBACK? 語句回滾整個事務(wù)。

舉例

假設(shè)一個事務(wù)執(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

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

OceanBase記錄savepoint

事務(wù)參與者列表

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

OceanBase事務(wù)參與者列表

savepoint 回滾過程

  1. 根據(jù) savepoint 鏈表查詢 spname 對應(yīng)的 sql_no
  2. 假設(shè)用戶執(zhí)行 ROLLBACK to SAVEPOINT sp2,根據(jù) savepoint 鏈表查詢到 sp2 對應(yīng)的 sql_no 為 3。

  3. 根據(jù)事務(wù)參與者列表查詢 sql_no 對應(yīng)的 partition
  4. 根據(jù)事務(wù)參與者列表查詢到 sql_no 大于 3 的語句操作的分區(qū)涉及 p1、p3、p5、p6。

  5. 回滾分區(qū)數(shù)據(jù)
  6. 根據(jù)第2步查詢到的分區(qū),調(diào)度程序向這些分區(qū)發(fā)起回滾請求,回滾當(dāng)前事務(wù)在這些分區(qū)上 sp2 之后的所有修改。其中 p1、p3、p5 上關(guān)于本事務(wù)的部分修改被回滾掉,p6 上關(guān)于本事務(wù)的所有修改都被回滾掉。

  7. 更新事務(wù)參與者列表信息
  8. 修改事務(wù)參與者列表,將 sql_no 大于 3 的操作信息從事務(wù)參與者列表中刪除,由于 p6 上的所有修改都被回滾掉,因此 p6 可以從參與者列表中刪除。

    savepoint 回滾過程

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

    刪除無效的savepoint

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號