1.理論部分
事務會把表示工作邏輯單元的SQL語句集成起來。
(1)commit
當數據庫提交COMMIT語句的時候,這個事務就結束了,並且如下結果會發生:
- 事務所做的所有工作都會永久化
- 其他用戶可以看到這個事務所做的數據變更
- 該事務擁有的所有鎖被釋放
commit語句的語法如下:
COMMIT [WORK];
(2)rollback
當ROLLBACK語句提交到數據庫時,這個事務就結束了,並且會出現以下結果:
- 該事務所做的所有工作都被撤銷,就像沒有執行過這個事務一樣。
- 該事務擁有的所有鎖被釋放
rollback語句的語法如下:
ROLLBACK [WORK];
(3)savepoint
使用savepoint命令,可以實現只有事務的部分工作被撤銷。
savepoint語句的語法如下:
SAVEPOINT name;
一般配合rollback語句來使用,語法如下:
ROLLBACK [wowk] to SAVEPOINT name;
當ROLLBACK to SAVEPOINT name提交到數據庫時,就會出現如下結果:
- 從SAVEPOINT起所有工作被撤銷。但是,SAVEPOINT仍然是活躍的,直到執行完COMMIT或者是ROLLBACK,在需要的時候,可以再次回滾。
- 從SAVEPOINT以來SQL語句所擁有的的所有鎖和資源被釋放。
- 事務沒結束,因為SQL語句還沒有最終結束。
2.事務案例1
create table cust_info(id number,name Varchar2(40) ,constraint p_cust_info primary key(id));
insert into cust_info values(1,'Jack');
insert into cust_info values(2,'Logan');
insert into cust_info values(3,'Oliver');
commit;
declare
begin
insert into cust_info values(5,'張三');
SAVEPOINT A;
insert into cust_info values(6,'李四');
SAVEPOINT B;
insert into cust_info values(7,'王五');
SAVEPOINT C;
insert into cust_info values(8,'周六');
SAVEPOINT D;
ROLLBACK TO SAVEPOINT B;
end;
當執行完上述的PL/SQL語句后,再執行
select * from cust_info
我們可以看到只存在id為5,6的兩條記錄。
3.事務案例2
DECLARE
v_Counter NUMBER;
BEGIN
v_Counter := 0;
for i IN 1..100
LOOP
v_Counter := v_Counter + 1;
IF v_Counter = 10
THEN
COMMIT;
dbms_output.put_line(v_Counter);
v_Counter := 0;
END IF;
END LOOP;
END;
上述案例的執行結果是:
10
10
10
10
10
10
10
10
10
10
表示整個PL/SQL塊中有10個事務。