儲存過程、觸發器與事務之間的關係
下面透過簡單的例子說明儲存過程、觸發器與事務之間的關係:
SQL> create table a(id number);
表已建立。
SQL> create table b(id number);
表已建立。
SQL> create or replace trigger test_a1
2 before insert on a
3 for each row
4 declare
5 begin
6 insert into b values(:new.id);
7 end test_a1;
8 /
觸發器已建立
SQL> insert into a values(1);
已建立 1 行。
SQL> select * from a;
ID
----------
1
SQL> select * from b;
ID
----------
1
SQL> rollback;
回退已完成。
SQL> select * from a;
未選定行
SQL> select * from b;
未選定行
SQL> create unique index idx_b1 on b(id);
索引已建立。
SQL> insert into b values(2);
已建立 1 行。
SQL> commit;
提交完成。
SQL> insert into a values(2);
insert into a values(2)
*
第 1 行出現錯誤:
ORA-00001: 違反唯一約束條件 (XIAOYANG.IDX_B1)
ORA-06512: 在 "XIAOYANG.TEST_A1", line 3
ORA-04088: 觸發器 'XIAOYANG.TEST_A1' 執行過程中出錯
SQL> select * from a;
未選定行
從上面的例子可以看出,向A表中插入資料和觸發器TEST_A1向B表插入資料是在同一個事務中,要麼都成功,要麼都失敗,如果由於某種原因導致觸發器向B表插入資料失敗,那麼整個事務失敗,向A表插入資料也就失敗。
從另一個角度來說,在觸發器中不允許有COMMIT語句的出現,例如:
SQL> create or replace trigger XIAOYANG.test_a1
2 before insert on a
3 for each row
4 declare
5 begin
6 insert into b values(:new.id);
7 commit;
8 end test_a1;
9 /
觸發器已建立
SQL>
SQL> insert into a values (3);
insert into a values (3)
*
第 1 行出現錯誤:
ORA-04092: COMMIT 不能在觸發器中
ORA-06512: 在 "XIAOYANG.TEST_A1", line 4
ORA-04088: 觸發器 'XIAOYANG.TEST_A1' 執行過程中出錯
這個設計也是為了確保觸發器操作和SQL語句的操作在同一個事務而設計的限制條件吧!
然而儲存過程中允許有COMMIT的出現,也就是說,呼叫儲存過程的SQL語句和儲存過程中的SQL語句可能在不同的事務中。
由此可以大概得出出現結論:觸發器能夠確保與觸發的SQL在同一個事務中,那麼在執行主表的DML語句的時候,由於觸發器的存在可能導致主表DML語句效能的下降。而儲存過程不能確保與呼叫SQL在同一個事務中。
觸發器的觸發級別請參考文章:http://space.itpub.net/23135684/viewspace-712450
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23135684/viewspace-709920/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【MySQL】MySQL(三)儲存過程和函式、觸發器、事務MySql儲存過程函式觸發器
- oracle儲存過程和觸發器Oracle儲存過程觸發器
- SQL Server實戰五:儲存過程與觸發器SQLServer儲存過程觸發器
- 七、函式-儲存過程-觸發器函式儲存過程觸發器
- 瞭解使用mysql 的檢視、儲存過程、觸發器、函式....MySql儲存過程觸發器函式
- 《MySQL 基礎篇》九:儲存過程、流程控制和觸發器MySql儲存過程觸發器
- 儲存過程與儲存函式儲存過程儲存函式
- MySQL之儲存過程MySql儲存過程
- 2020重新出發,MySql基礎,MySql檢視&索引&儲存過程&觸發器MySql索引儲存過程觸發器
- SqlServer儲存過程的建立與使用SQLServer儲存過程
- mySql 儲存過程與函式MySql儲存過程函式
- MySQL索引、事務與儲存引擎MySql索引儲存引擎
- MySQL 高階 | 用儲存過程、定時器、觸發器來解決資料分析問題MySql儲存過程定時器觸發器
- TLS與SSL之間關係TLS
- 關於Entity Freamwork 儲存過程操作儲存過程
- oracle的儲存過程Oracle儲存過程
- 思考 TPS 與 RT 之間的關係
- 類與類之間的基本關係
- 瞭解SQL Server觸發器及觸發器中的事務AWSQLServer觸發器
- Oracle儲存過程乾貨(一):儲存過程基礎Oracle儲存過程
- SQL 儲存過程裡呼叫另一個儲存過程SQL儲存過程
- MySQL--儲存過程與檢視MySql儲存過程
- SQLSERVER儲存過程SQLServer儲存過程
- 呼叫儲存過程儲存過程
- mysql 儲存過程MySql儲存過程
- unidac儲存過程儲存過程
- firedac儲存過程儲存過程
- Oracle儲存過程Oracle儲存過程
- MySQL全面瓦解16:儲存過程相關MySql儲存過程
- SpringFlux中Request與HandlerMapping關係的形成過程SpringUXAPP
- MySQL入門系列:儲存程式(三)之儲存過程簡介MySql儲存過程
- Sqlserver中的儲存過程SQLServer儲存過程
- Mysql 儲存過程的使用MySql儲存過程
- 23. 使用MySQL之使用儲存過程MySql儲存過程
- 計算機儲存器容量和定址能力的關係計算機
- 為什麼你的MySQL效能差?函式、儲存過程和觸發器都確認無誤嗎?MySql函式儲存過程觸發器
- kubernetes儲存類與PV與PVC關係及實踐
- MySQL自定義函式與儲存過程MySql函式儲存過程
- [20180502]PLDEVELOP與儲存過程除錯.txtdev儲存過程除錯