事務ACID特性:sql
1.Atomicty(原子性)數據庫
2.Consistency(一致性)服務器
3.IsoIation(隔離性)併發
4.Durability(持久性)blog
原子性:對數據的修改要麼所有執行成功,要麼所有失敗。事務
一致性:若是A帳戶給B帳戶賺錢,不可能A扣錢,B沒有價錢。get
隔離性:不一樣的事務併發操做相同的數據時,每一個事務都有各自完整的數據空間。it
持久性:事務一旦提交,數據庫中的數據必須被永久保存下來,即便服務器崩潰仍是斷電,只要數據庫重啓數據就會恢復到事務成功結束後的狀態。io
髒讀:髒讀是指在一個事務處理過程裏讀取了另外一個未提交的事務中的數據。(能夠理解不是正確的數據)table
不可重複讀:
幻讀:
不可重複讀和幻都是讀取另外一條已提交的事務,不可重複讀的重點是update和delete,而幻讀是insert。
在可重複讀中:該sql第一次讀取到數據後,就將這些數據加鎖,其它事務沒法修改這些數據,就能夠實現可重複 讀了。但這種方法卻沒法鎖住insert的數據,
因此當事務A先前讀取了數據,或者修改了所有數據,事務B仍是能夠insert數據提交,這時事務A就會 發現莫名其妙多了一條以前沒有的數據,這就是幻讀,
不能經過行鎖來避免。須要Serializable隔離級別 ,讀用讀鎖,寫用寫鎖,讀鎖和寫鎖互斥,這麼作能夠有效的避免幻讀、不可重複讀、髒讀等問題,
但會極大的下降數據庫的併發能力。
如今來看看MySQL數據庫爲咱們提供的四種隔離級別:
① Serializable (串行化):可避免髒讀、不可重複讀、幻讀的發生。
② Repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。
③ Read committed (讀已提交):可避免髒讀的發生。
④ Read uncommitted (讀未提交):最低級別,任何狀況都沒法保證。
在MySQL數據庫中默認的隔離級別爲Repeatable read (可重複讀)。
查看當前事務的隔離級別:
將事務的隔離級別設置爲Read uncommitted級別:
記住:設置數據庫的隔離級別必定要是在開啓事務以前!