一,事務的4個基本特徵
Atomic(原子性):
事務中包含的操作被看做一個邏輯單元,這個邏輯單元中的操作要
麼全部成功,要麼全部失敗。
Consistency(一致性):
只有合法的資料可以被寫入資料庫,否則事務應該將其復原到最初
狀態。
Isolation(隔離性):
事務允許多個使用者對同一個資料進行並發訪問,而不破壞資料的正
確性和完整性。同時,並行事務的修改必須與其他並行事務的修改
相互獨立。
Durability(持久性):
事務結束後,交易處理的結果必須能夠得到固化。
以上屬於廢話
二,為什麼需要對事務並發控制
如果不對事務進行並發控制,我們看看資料庫並行作業是會有那些異常情形
Lost update:
兩個事務都同時更新一行資料,但是第二個事務卻中途失敗退出,
導致對資料的兩個修改都失效了。
Dirty Reads:
一個事務開始讀取了某行資料,但是另外一個事務已經更新了此數
據但沒有能夠及時提交。這是相當危險的,因為很可能所有的操作
都被復原。
Non-repeatable Reads:
一個事務對同一行資料重複讀取兩次,但是卻得到了不同的結果。
Second lost updates problem:
無法重複讀取的特例。有兩個並發事務同時讀取同一行資料,然後其
中一個對它進行修改提交,而另一個也進行了修改提交。這就會造成
第一次寫操作失效。
Phantom Reads:
事務在操作過程中進行兩次查詢,第二次查詢的結果包含了第一次查
詢中未出現的資料(這裡並不要求兩次查詢的SQL語句相同)。這是
因為在兩次查詢過程中有另外一個事務插入資料造成的。
三, 資料庫的隔離等級
為了兼顧並發效率和異常控制,在標準SQL規範中,定義了4個事務隔
離層級,(ORACLE和SQLSERER對標準隔離等級有不同的實現 )
Read Uncommitted:
直譯就是"讀未提交",意思就是即使一個更新語句沒有提交,但是別
的事務可以讀到這個改變.這是很不安全的.
Read Committed:
直譯就是"讀提交",意思就是語句提交以後即執行了COMMIT以後
別的事務就能讀到這個改變.
Repeatable Read:
直譯就是"可以重複讀",這是說在同一個事務裡面先後執行同一個
查詢語句的時候,得到的結果是一樣的.
Serializable:
直譯就是"序列化",意思是說這個事務執行的時候不允許別的事務
並發執行.
四,隔離等級對並發的控制
下表是各隔離等級對各種異常的控制能力:
| |
LU |
DR |
NRR |
SLU |
PR |
| RU |
N |
Y |
Y |
Y |
Y |
| RC |
N |
N |
Y |
Y |
Y |
| RR |
N |
N |
N |
N |
Y |
| S |
N |
N |
N |
N |
N |