【Oracle】PL/SQL塊中使用事務


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個事務。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM