oracle事務學習與筆記

1、 什麼是事務 

事務是作爲單個邏輯工作單元執行的一系列操作。一個邏輯工作單元必須有四個屬性,稱爲ACID(原子性、一致性、隔離性和持久性)屬性,只有這樣才能成爲一個事務: 

原子性:事務必須是原子工作單元;對於其數據修改,要麼全都執行,要麼全都不執行。 

一致性:事務在完成時,必須使所有的數據都保持一致狀態。在相關數據庫中,所有規則都必須應用於事務的修改,以保持所有數據的完整性。事務結束時,所有的內部數據結構(如 B 樹索引或雙向鏈表)都必須是正確的。 

隔離性:由併發事務所作的修改必須與任何其它併發事務所作的修改隔離。事務查看數據時數據所處的狀態,要麼是另一併發事務修改它之前的狀態,要麼是另一事務修改它之後的狀態,事務不會查看中間狀態的數據。這稱爲可串行性,因爲它能夠重新裝載起始數據,並且重播一系列事務,以使數據結束時的狀態與原始事務執行的狀態相同。 

持久性:事務完成之後,它對於系統的影響是永久性的。該修改即使出現系統故障也將一直保持。 

2、事務級別
隔離級別                            髒讀          不可重複讀       幻像讀
READ UNCOMMITTED(讀未提交)        允許          允許             允許
READ COMMITTED(讀已提交)          不允許        允許             允許
REPEATABLE READ(可重複讀)         不允許        不允許           允許
SERIALIZABLE(可串行化)            不允許        不允許           不允許

隔離級別解釋:
髒讀(dirty read):當一個事務讀取另一個事務未提交的修改時,產生髒讀。
不可重複讀(nonrepeated read):同一查詢在同一事務中多次進行,由於其他事務提交所做的修改或刪除,導致每次返回的結果不同,此時發生不可重複讀。
幻讀(phantom read):同一查詢在同一事務中多次進行,由於其他事務提交所做的插入操作,每次發生的不同的結果集,此時發生幻讀。

Oracle的事務隔離級別:
Oracle提供read committed和serializable,並提供了一個非SQL標準的read-only級別。

已提交讀取(read committed)    
Oracle默認使用的事務隔離級別。事務內執行的查詢只能看到查詢執行前(而非事務開始前)就已經提交的數據。Oracle的查詢永遠不會讀取髒數據(未提交的數據)。

Oracle不會阻止一個事務修改另一事務中的查詢正在訪問的數據,因此在一個事務內的兩個查詢的執行間歇期間,數據有可能被其他事務修改。舉例來說,如果一個事務內同一查詢執行兩次,可能會遇到不可重複讀取或不存在讀取的現象。 
 
串行化(serializable)    
串行化隔離的事務只能看到事務執行前就已經提交的數據,以及事務內 INSERT , UPDATE ,及 DELETE語句對數據的修改。串行化隔離的事務不會出現不可重複讀取或不存在讀取的現象。 
 
只讀模式(read-only)    
只讀事務只能看到事務執行前就已經提交的數據,且事務中不能執行 INSERT , UPDATE ,及 DELETE 語句。

設置一個事務的隔離級別:

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET TRANSACTION READ ONLY;

設置單個會話的隔離級別:

ALTER SESSION SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
ALTER SESSION SET TRANSACTION ISOLATION SERIALIZABLE;

查看會話鎖級別:

SELECT s.sid, s.serial#,
  CASE BITAND(t.flag, POWER(2, 28))
    WHEN 0 THEN 'READ COMMITTED'
    ELSE 'SERIALIZABLE'
  END AS isolation_level
FROM v$transaction t
JOIN v$session s ON t.addr = s.taddr AND s.sid = sys_context('USERENV', 'SID');


3、 事務的控制 

oracle沒有“開始事務”的語句,事務隱式地開始於第一條修改數據的語句,並以commit或rollback語句顯式的結束事務。一條語句要麼完全執行,要麼完全回滾,一條語句的失敗不能使它前面執行的語句自動回滾。 

事務控制語句:commit,rollback,savepoint,rollback to <savepoint>
set transaction:設置不同的事物屬性,例如隔離等級和是否只讀或可讀寫,也可以使用此語句來指示事務使用某個特定的回滾段。 

COMMIT是事務提交命令。 

ROLLBACK是事務回滾命令,在尚未提交commit命令之前,如果發現delete、insert和update等操作需要恢復的話,可以使用rollback命令回滾到上次commit時的狀態。 

SAVEPOINT是保存點命令。事務通常由數條命令組成,可以將每個事務劃分成若干個部分進行保存,這樣每次可以回滾每個保存點,而不必回滾整個事務。語法格式如下。
創建保存點:savepoint 保存點名;
回滾保存點:rollback to 保存點名; 


4、sqlplus中事務提交方式
顯示commit;
通過autocommit 參數設置事務的自動提交方式, show autocommit查看事務提交方式,set autocommit on--開啓sqlplus 中的自動提交功能。
退出sqlplus 的時候提交或者回滾事務,如果使用exit 或者quit 命令友好的提出sqlplus 未提交的事務將會被自動的提交;如果異常的退出sqlplus 未提交的事務將會被回滾掉,比如直接叉掉sqlplus。


參考資料:
https://blog.csdn.net/leozhou13/article/details/50449965
https://www.cnblogs.com/Cilimer/p/4192712.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章