OceanBase SAVEPOINT

2021-06-29 14:31 更新

描述

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

格式

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

參數(shù)說(shuō)明

參數(shù)

描述

spname

指定SAVEPOINT的名稱(chēng)SAVEPOINT是事務(wù)范圍內(nèi)唯一的,一個(gè)SAVEPOINT會(huì)覆蓋前一個(gè)同名的SAVEPOINT。創(chuàng)建SAVEPOINT后可以將事務(wù)回滾到指定SAVEPOINT,也可以使用ROLLBACK語(yǔ)句回滾整個(gè)事務(wù)。

示例

假設(shè)一個(gè)事務(wù)執(zhí)行了如下語(yǔ)句:

sql_no

語(yǔ)句

分區(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

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

OceanBase SAVEPOINT

事務(wù)參與者列表

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

OceanBase SAVEPOINT

Savepoint 回滾過(guò)程

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

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

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)