事務 Transaction的那些事


事務是什麼
事務用來維護數據庫數據的完整性,它保障成批的sql要麼所有執行,要麼所有不執行。mysql

 

事務的ACID特性sql

Atomicity 原子性。原子性是 事物是不可分割的最小的單元,事物內的全部操做,要麼所有提交成功,要麼所有失敗回滾。例如:A賬戶向B賬戶 轉帳1000元,則先檢查A帳戶餘額是否有1000元,而後將A帳戶的餘額減小1000,再將B帳戶的餘額增長1000,這兩個動做要麼都提交成功,要麼都回退,不可能發生一個有效、一個無效的狀況。數據庫


Consistency 一致性。一致性是 事物執行前數據庫的數據處於正確狀態,事物執行後數據庫的數據仍處於正確狀態。(如:a帳戶轉帳給b帳戶,不能出現a帳戶扣錢了而b帳戶沒有收到200)安全

Isolation 隔離性。隔離性是 數據庫容許多個併發事務同時對其數據進行讀寫和修改的能力,隔離性能夠防止多個事務併發執行時因爲交叉執行而致使數據的不一致。這須要事物的隔離級別來指定事物的隔離性。例如:在A、B之間轉賬時,C同時向A轉賬,若同時進行則A、B之間的一致性不能獲得知足。因此在A、B事務執行過程當中,其餘事務不能訪問(修改)當前相關的數值。併發

Durability 永久性。永久性是 事務一旦提交,對數據庫的數據改變必須是永久的,就是說修改後的數據永久性的保存到數據庫中,不會由於遇到系統故障或斷電形成數據不一致或丟失。在提交以前若是系統故障,則全部信息所有丟失。提交以後數據存放在磁盤中,是永久性的。

oracle


事務併發帶來的問題
1)丟失更新 Lost Update:(沒有加鎖)
兩個事務同時更新一行數據,最後一個事務的更新會覆蓋掉第一個事務的更新,從而致使第一個事務更新的數據丟失,這是因爲沒有加鎖形成的。性能

2)髒讀Dirty Reads:(沒有隔離)
一個事務看到了另一個事物沒有提交的更新數據。這是事務沒有隔離形成的。spa

3)不可重複讀:Non-Repeatable Reads
在同一事務中,屢次讀取同一數據可是返回不一樣的結果,也就是有其餘事務更改了這些數據。日誌

4)幻讀:Phantom Reads 併發形成的
一個事務在執行過程當中讀取到另外一個事務已提交的插入數據。就是說在第一個事務開始時,讀取到一批數據,可是伺候另外一個事務又插入新數據並提交,此時第一個事務又讀取到這批數據可是發現多出了一條,貌似產生幻覺同樣。這是併發形成的。事務

 

經過設置隔離級別isolation level來解決併發問題。
事務的四種隔離級別:
1)未提交讀(Read Uncommitted):一個事務可以讀取到 別的事務中沒有提交的更新數據。事務能夠讀取到未提交的數據,這也被稱爲髒讀(dirty read)。
因此這種級別頗有可能讀到髒數據,隔離級別最低。

2)提交讀(Read Committed):一個事務只能讀取到別的事務提交的更新數據。
通常咱們提交讀就能夠了。只能讀取到已經提交的數據。即解決了髒讀,但未解決不可重複讀。(oracle默認的)

3)可重複讀(Repeated Read):保證同一事務中前後執行的屢次查詢將返回贊成結果,不受其餘事務的影響。這種隔離級別可能出現幻讀。(mysql默認的)


4)序列化(Serializable):不容許事務併發執行,強制事務串行執行,就是在讀取的每一行數據上都加上了鎖,讀寫相互都會阻塞。這種隔離級別最高,是最安全的,性能最低,不會出現髒讀,不可重複讀,幻讀,丟失更新。

如何設置隔離級別


SET TRANSACTION ISOLATION LEVEL READ COMMITTED; //設置提交讀隔離級別
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; //設置序列化隔離級別


事務的(ACID)特性是由關係數據庫管理系統(RDBMS,數據庫系統)來實現的。
數據庫管理系統採用 重執行日誌 來保證事務的原子性、一致性和持久性。日誌記錄了事務對數據庫所作的更新,若是某個事務在執行過程當中發生錯誤,就能夠根據日誌,撤銷事務對數據庫已作的更新,使數據庫退回到執行事務前的初始狀態。

數據庫管理系統採用數據庫鎖機制來實現事務的隔離性。當多個事務同時更新數據庫中相同的數據時,只容許持有鎖的事務能更新該數據,其餘事務必須等待,直到前一個事務釋放了鎖,其餘事務纔有機會更新該數據。

相關文章
相關標籤/搜索