儲存過程、觸發器與事務之間的關係
下面透過簡單的例子說明儲存過程、觸發器與事務之間的關係:
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儲存過程觸發器
- 七、函式-儲存過程-觸發器函式儲存過程觸發器
- 儲存過程 檢視 觸發器 序列儲存過程觸發器
- (interbase之九)intebase的儲存過程、觸發器以及事件、異常 (轉)儲存過程觸發器事件
- MySQL 儲存過程/遊標/事務MySql儲存過程
- 儲存過程中巢狀事務儲存過程巢狀
- 檢視錶,儲存過程,觸發器定義的方法儲存過程觸發器
- 破解儲存過程,函式,檢視,觸發器解密儲存過程函式觸發器解密
- oracle plsql儲存過程_if判斷與事務commitOracleSQL儲存過程MIT
- 不要在儲存過程中控制事務儲存過程
- t_c_b_s之後臺儲存過程_更新表間關係小記儲存過程
- 瞭解使用mysql 的檢視、儲存過程、觸發器、函式....MySql儲存過程觸發器函式
- 儲存過程注意事項儲存過程
- 第五篇 : MySQL 之 檢視、觸發器、儲存過程、函式、事物與資料庫鎖MySql觸發器儲存過程函式資料庫
- 《MySQL 基礎篇》九:儲存過程、流程控制和觸發器MySql儲存過程觸發器
- Oracle資料庫儲存結構之間的關係Oracle資料庫
- MySQL 儲存過程中事務sql異常回滾MySql儲存過程
- tcbs_批量儲存過程_輸出引數out與異常的關係儲存過程
- 儲存過程與儲存函式儲存過程儲存函式
- MySQL之儲存過程MySql儲存過程
- 檢視錶、檢視、索引、儲存過程和觸發器的定義的方法索引儲存過程觸發器
- job呼叫儲存過程的注意事項儲存過程
- oracle自動生成編譯所有函式、儲存過程、觸發器的語句Oracle編譯函式儲存過程觸發器
- MyBatis 示例之儲存過程MyBatis儲存過程
- tcbs_批量儲存過程_plsql事務_savepoint_異常儲存過程SQL
- 儲存過程與函式儲存過程函式
- MySQL定時任務與儲存過程例項MySql儲存過程
- Oracle檢視錶、儲存過程、觸發器、函式等物件定義語句Oracle儲存過程觸發器函式物件
- oracle 建立表,序列,索引,檢視,觸發器,函式,儲存過程,定時器,包體Oracle索引觸發器函式儲存過程定時器
- MySQL索引、事務與儲存引擎MySql索引儲存引擎
- mysql主從和觸發器的關係MySql觸發器
- SqlServer儲存過程的建立與使用SQLServer儲存過程
- 2020重新出發,MySql基礎,MySql檢視&索引&儲存過程&觸發器MySql索引儲存過程觸發器
- (Oracle)儲存過程、儲存函式和包的相關知識與例項Oracle儲存過程儲存函式
- 瞭解SQL Server觸發器及觸發器中的事務AWSQLServer觸發器