如果開啓一個事務,已經寫了很多語句,突然發現執行完上一語句時發現語句寫錯了。你只好使用rollback語句讓數據庫恢復到事務開啓之前的狀態。以前寫完的語句也需要重新執行。所以mysql數據庫的作者提出了保存點(savepoint)的概念。開啓事務後在執行語句後面打幾個點,我們調用rollback語句就會回滾到指定的點。而不是回到事務執行之前的樣子。
定義保存點的語法如下:
SAVEPOINT 保存點的名稱;
當我們想回滾到某個保存點時,可以使用下邊的語句。(WORK和SAVEPOINT可有可無)
ROLLBACK [WORK] TO [SAVEPOINT]
不過如果rollback後面不跟保存點的名稱,事務就會回滾到執行之前的狀態。
如果想刪除某個保存點可以使用下面的語句。
RELEASE SAVEPOINT 保存點名稱;
下面舉個例子來說明保存點的用法。張三向貓爺轉賬2塊錢。在執行完扣除張三2塊錢處打一個保存點。
select * from account;
id | name | balance |
1 | 狗哥 | 11 |
2 | 貓爺 | 2 |
3 | 張三 | 10 |
#開啓事務
begin;
update account set balance =balance-2 where id=3;
savepoint s1; #一個保存點
select * from account;
id | name | balance |
1 | 狗哥 | 11 |
2 | 貓爺 | 2 |
3 | 張三 | 8 |
UPDATE account SET balance = balance + 1 WHERE id = 2; #更新錯了
回滾事務到保存點;
rollback to s1; #回滾到保存點
select * from account;
id | name | balance |
1 | 狗哥 | 11 |
2 | 貓爺 | 2 |
3 | 張三 | 10 |