四大特性ACID
原子性(Atomicity)
原子性是指事務包含的所有操作要么全部成功,要么全部失敗回滾。失敗回滾的操作事務,將不能對數據庫有任何影響
一致性(Consistency)
一致性是指事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之后都必須處於一致性狀態。例如轉賬操作:A賬戶轉入B賬戶1000元,A賬戶少了1000,B賬戶多了1000;事務結束后總金額保持不變。
隔離性 (Isolation)
隔離性是指當多個線程並發訪問數據庫時,比如同時訪問一張表,數據庫每一個用戶開啟的事務,不能被其他事務所做的操作干擾,多個並發事務之間,應當相互隔離。
例如同時有T1和T2兩個並發事務,從T1角度來看,T2要不在T1執行之前就已經結束,要么在T1執行完成后才開始。將多個事務隔離開,每個事務都不能訪問到其他事務操作過程中的狀態。
隔離級別又分為四種,下面會做介紹
持久性(Durability)
持久性是指事務的操作,一旦提交,對於數據庫中數據的改變是永久性的,即使數據庫發生故障也不能丟失已提交事務所完成的改變。
事務隔離級別
先來了解一下讀取異常情況:
臟讀:數據庫的一個事務A正在使用一個數據但還沒有提交,另外一個事務B也訪問到了這個數據,還使用了這個數據,這就會導致事務B使用了事務A沒有提交之前的數據。
不可重復讀:在一個事務A中多次操作一個數據,在這兩次或多次訪問這個數據的中間,事務B也操作此數據,並使其值發生了改變,這就導致同一個事務A在兩次操作這個數據的時候值不一樣,這就是不可重復讀。
幻讀:一個事務重新執行一個查詢,返回一套符合查詢條件的行, 發現這些行因為其他最近提交的事務而發生了改變
隔離級別從低到高分為四級:
1,Read uncommitted(讀未提交):
寫事務阻止其他寫事務,避免了更新遺失。但是沒有阻止其他讀事務,可能會引發臟讀
2,Read committed(讀已提交):
讀取數據的事務允許其他事務繼續訪問該行數據,但是未提交的寫事務將會禁止其他事務訪問該行。
該隔離級別避免了臟讀,但是卻可能出現不可重復讀。事務A事先讀取了數據,事務B緊接了更新了數據,並提交了事務,而事務A再次讀取該數據時,數據已經發生了改變。
3,Repeatable read(可重復讀取):
讀取數據的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事務。
避免了不可重復讀取和臟讀,但是有時可能出現幻讀。這可以通過“共享讀鎖”和“排他寫鎖”實現。
4,Serializable(串行化):
讀加共享鎖,寫加排他鎖。這樣讀取事務可以並發,但是讀寫事務之間都是互斥的,一個事務執行完,才執行下一個事務序列化是最高的事務隔離級別,同時代價也花費最高,性能很低,一般很少使用,在該級別下,事務順序執行,不僅可以避免臟讀、不可重復讀,還避免了幻像讀。
隔離級別越高,越能保證數據的完整性和一致性,但是對並發性能的影響也越大。對於多數應用程序,可以優先考慮把數據庫系統的隔離級別設為Read Committed。它能夠避免臟讀取,而且具有較好的並發性能。盡管它會導致不可重復讀、幻讀和第二類丟失更新這些並發問題
大多數數據庫的默認級別就是Read committed,比如Sql Server , Oracle。
Mysql的默認隔離級別就是Repeatable read。