Transaction Ctrl Language
savepoint
rollback
savepoint可以理解成一些臨時的書籤記號,執行DDL類語句會摧毀這些書籤。
test1:
SQL> create table t1_ltn (id number);
Table created.
Elapsed: 00:00:00.02
SQL> insert into t1_ltn values (1);
1 row created.
Elapsed: 00:00:00.05
SQL> savepoint a1;
Savepoint created.
Elapsed: 00:00:00.00
SQL> insert into t1_ltn values (2);
1 row created.
Elapsed: 00:00:00.00
SQL> savepoint a2;
Savepoint created.
Elapsed: 00:00:00.00
SQL> commit;
Commit complete.
Elapsed: 00:00:00.02
SQL> rollback to a1;
rollback to a1
*
ERROR at line 1:
ORA-01086: savepoint 'A1' never established in this session or is invalid
Elapsed: 00:00:00.00
一旦commit,savepoint即被破壞。‘
test2:
重複上面的步驟,建立a1,a2兩個savepoint。
此時rollback to a1是成功的,然是隨後rollback to a2會報錯:
SQL> rollback to a1;
Rollback complete.
Elapsed: 00:00:00.00
SQL> rollback to a2;
rollback to a2
*
ERROR at line 1:
ORA-01086: savepoint 'A2' never established in this session or is invalid
Elapsed: 00:00:00.00
但是按照這個邏輯先rollback to a2,再rollbak to a1則是成功的。
說明只能按照savepoint的倒數順序來rollback。