1,引出事務的概念:
兩個客戶端1,2 訪問數據庫同一張表 表中有18條數據
現象:
1客戶端刪除表中一條數據 但是沒有提交 commit,這個時候1客戶端查詢數據有17條數據,而2客戶端查詢還有18條數據
如果1客戶端commit之後, 在查詢2客戶端也變成了17條數據
爲什麼要提交一下?
數據庫往往把一系列的對數據庫的操作(dml)看做一個整體,要麼全部成功,要麼全部失敗。這樣現象就稱爲事務。
事務具有原子性。
典型事例:銀行轉賬,利用事務可以保證數據的完整性
在對錶進行事務操作的時候,oracle會在該表上加上一把鎖,防止其他用戶修改表的結構
當執行了commit語句之後,會確認事務的變化,結束事務,刪除保存點,釋放鎖。其他會話可以查看事務變化後的數據。
2,事務的隔離級別:定義事務與事務之間的隔離程度
隔離級別 髒讀 不可重複讀 幻讀
讀未提交 會出現 會出現 會出現
讀已提交 不出現 會出現 會出現
可重複讀 不出現 不出現 會出現
可串行化 不出現 不出現 不出現
不同數據庫廠商有不同的實現,上面只是定義了一個標準
髒讀:當一個事務讀取到另一個事務尚未提交的數據,稱爲髒讀,oracle數據庫不會出現髒讀的情況
不可重複讀:在同一個事務的同一個查詢結果受到了另一個事務的修改或刪除的影響。就出現了不可重複讀
例如:財務報表以某時某分爲界限來進行統計的。
幻讀:在同一個事務的同一個查詢,如果因爲別的事務添加造成本事務查詢的結果不一致,這個現象稱爲幻讀。
oracle的事務隔離級別只有三種:
ANSI/ISO SQL規定了四種事務隔離級別,分別是:read uncommitted,read committed,repeatable read,serializable
ORACE提供了SQ92標準中的read committed和seriaizabe,同時提供了非SQ92標準的read-ony。
read committed:
這是ORACE缺省的事務隔離級別。
事務中的每一條語句都遵從語句級的讀一致性。
保證不會髒讀;但可能出現非重複讀和幻像。
seriaizabe:(串行執行事務,併發性最小)
簡單地說,seriaizabe就是使事務看起來象是一個接着一個地順序地執行。
僅僅能看見在本事務開始前由其它事務提交的更改和在本事務中所做的更改。
保證不會出現非重複讀和幻像。
Seriaizabe隔離級別提供了read-ony事務所提供的讀一致性(事務級的讀一致性),同時又允許DM操作。
如果有在seriaizabe事務開始時未提交的事務在seriaizabe事務結束之前修改了seriaizabe事務將要修改的行並進行了提交,則seriaizabe事務不會讀到這些變更,因此發生無法序列化訪問的錯誤。(換一種解釋方法:只要在seriaizabe事務開始到結束之間有其他事務對seriaizabe事務要修改的東西進行了修改並提交了修改,則發生無法序列化訪問的錯誤。)
read-ony:
遵從事務級的讀一致性,僅僅能看見在本事務開始前由其它事務提交的更改。
不允許在本事務中進行DM操作。
read ony是seriaizabe的子集。它們都避免了非重複讀和幻像。區別是在read ony中是隻讀;而在seriaizabe中可以進行DM操作。
Export with CONSISTENT = Y sets the transaction to read-ony.