四個基本性質(ACID)
1.原子性(Atomicity)
事務中包含的操作要麼全做要麼全不做(all or none)。
2.一致性(consistency)
在事務開始以前數據處於一致性狀態,事務結束後,數據也應處於一致性狀態。
拿銀行轉賬來說,一致性要求事務的執行不應該改變A、B兩個賬戶的金額總和。如果沒有這種一致性要求,轉賬過程中就會發生錢無中生有,或者不翼而飛的現象。事務應該把數據庫從一個一致性狀態轉換到令一個一致性狀態。
3.隔離性(isolation)
事務的隔離性要求系統必須保證事務不受其他併發執行的事務的影響,也既要達到這樣的一個效果:對於任何一對事務T1和T2,對於T1來說,T2要麼在T1之前執行,要麼在T1之後執行。這樣每個事務都感覺不到還有其他並行執行的事務的存在。
4.持久性(durability)
一個事務一旦完成,他對數據的改變必須是永久的。即使遇到故障也不會丟失,數據重要性決定了事務的持久性的重要性。
數據庫的併發帶來的問題
髒讀
第二個事務讀取到第一個事務尚未確認的數據。
1、事務A將數據x從原來的1000修改成2000
2、事務B在事務A未提交時,讀到了x是2000
3、事務A回滾,最終x恢復成1000
最終x的正確值應是1000,而事務B讀到了錯誤的x=2000的值
示例
1、Mary的工資是1000,財務把many的工資修改成了2000。
2、Mary查看自己的工資時發現時2000,非常高興。
3、財務發現Mary的工資錄入錯誤,立即又改回了1000。
Mary查詢到自己的工資是2000就是髒數據,最終她是拿不到那麼多的錢的。
不可重複讀
一個事務在兩次查詢中得到的結果不一致。
1、事務A查詢x的值是1000,事務未結束
2、事務B將x修改成2000
3、事務A再次查詢x時,變成了2000
示例
1、Mary查詢自己的工資是1000,操作尚未完成
2、財務將Mary修改成2000
3、當Mary再次查詢自己的工資時發現變成了2000
幻象讀
一個事務兩次查詢到的記錄數量不相同
1、事務A統計出x=1000的記錄數是10條,事務未結束
2、事務B向數據庫中插入了一條x=1000的記錄
3、事務A再次統計時發現x=1000的記錄數變成了11條
示例
1、Mary查詢自己2011年的工資條是10個(截止到10月,11月的工資還未發放)
2、財務正好錄入了Mary的11月的工資條
3、當Mary再查詢自己2011年的工資條時發現變成了11個,感到莫名其妙
設置和查看全局事務隔離級別(MySQL)
mysql默認隔離級別是Repeatable Read
SELECT @@global.tx_isolation;
SET GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;
設置和查看session事務隔離級別
SELECT @@session.tx_isolation;
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
設置和查看全局autocommit標記
SELECT @@global.autocommit;
SET GLOBAL autocommit = off / on;