一、事務(wù)是什么
事務(wù)是一條或多條數(shù)據(jù)庫操作語句的組合,具備ACID四個特征:
-
原子性(Atomicity)
要不全部成功,要不全部撤銷。
-
一致性( Consistency )
數(shù)據(jù)庫正確地改變狀態(tài)后,數(shù)據(jù)庫的一致性約束沒有被破壞。
-
隔離性( Isolation )
事務(wù)之間相互獨立,互不干擾。
-
持續(xù)性( Durability )
事務(wù)的提交結(jié)果,將持久保存在數(shù)據(jù)庫中。
二、事務(wù)并發(fā)會產(chǎn)生的問題
如果在沒有事務(wù)隔離的情況下,可能出現(xiàn):
-
臟讀
臟讀是指當(dāng)一個事務(wù)讀取了一條數(shù)據(jù),并對數(shù)據(jù)進行了修改,但是還沒有提交,這時另外一個事務(wù)也讀取了這條數(shù)據(jù),然后使用了這條數(shù)據(jù)。如:用戶的賬戶金額是100,T1將其修改為200,但是未提交,與此同時T2讀取到用戶賬戶金額是200,然后T1發(fā)生異常回滾,T2讀到的200就是臟數(shù)據(jù)。
-
不可重復(fù)讀
不可重復(fù)讀是指對于數(shù)據(jù)庫某一條數(shù)據(jù),一個事務(wù)內(nèi)多次查詢但是返回了不同的值,這是由于在查詢間隔,被另一個事務(wù)修改并提交了。
-
幻讀
在一個事務(wù)的兩次查詢中數(shù)據(jù)行數(shù)不一致。例如一個事務(wù)查詢了幾列數(shù)據(jù),而另外一個事務(wù)在此時插入了新的幾列數(shù)據(jù),第一個事務(wù)在接下來的查詢中會發(fā)現(xiàn)有幾列數(shù)據(jù)是它之前沒有的,就好像產(chǎn)生幻覺一樣,這就是發(fā)生了幻讀。
三、事務(wù)隔離級別
事務(wù)隔離級別解決了什么并發(fā)問題,還存在什么并發(fā)問題?
1、Read Uncommitted(讀取未提交內(nèi)容)
這是事務(wù)最低的隔離級別,它充許另外一個事務(wù)可以看到這個事務(wù)未提交的數(shù)據(jù)。對并發(fā)出現(xiàn)的任何問題都無法避免。
2、Read Committed(讀取提交內(nèi)容)
保證一個事務(wù)修改的數(shù)據(jù)提交后才能被另外一個事務(wù)讀取,即另外一個事務(wù)不能讀取該事務(wù)未提交的數(shù)據(jù)。可避免臟讀的發(fā)生,但是會出現(xiàn)不可重復(fù)讀、幻讀。
3、Repeatable Read(可重讀)
這是MySQL的默認事務(wù)隔離級別,它確保同一事務(wù)的多個實例在并發(fā)讀取數(shù)據(jù)時,會看到同樣的數(shù)據(jù)。可避免臟讀、不可重復(fù)讀的發(fā)生,但是會出現(xiàn)幻讀。
4、Serializable(可串行化)
這是最高的隔離級別,它通過強制事務(wù)排序,使之不可能相互沖突。在這個級別,可能導(dǎo)致大量的超時現(xiàn)象和鎖競爭。可避免臟讀、不可重復(fù)讀、幻讀的發(fā)生。
下一篇介紹InnoDB引擎的鎖機制。
以上就是MySQL事務(wù)、鎖以及應(yīng)用(一)的內(nèi)容,更多相關(guān)內(nèi)容請關(guān)注PHP中文網(wǎng)(www.php.cn)!