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