事務
- 事務的四大特性 ( ACID )
- 臟讀
- 不可重復讀
- 幻讀
- MySQL的隔離級別
事務指邏輯上的一組操作,組成這組操作的各個單元,要么全部成功,要么全部失敗,
事務的四大特性 ( ACID )
原子性(Atomicity):一個事物是一個不可分割的單位,要么全都執行,要么都不執行;
一致性(Consistency):事務執行前后,資料處于合法的狀態;
持久性(Isolation):事務執行完后,資料的修改是持久的,不會因為其他操作或故障而對其產生影響;
隔離性(Durability):多個事務并發執行的,事務之間不互相干擾,
假如事物的一個操作整體(動作A,B),動作A,執行完了,動作B,執行到一半,執行程序出錯,這時怎么辦?有回滾機制,有個日志會記錄這些操作,記錄資料修改前和資料修改后的值,
臟讀
事務A正在修改資料(但是沒有提交),事務B就讀取了這里的資料,此時事務B讀取的操作稱為臟讀,
解決辦法:給寫操作加鎖,當事務A在寫資料的時候,事務B無法讀取,
不可重復讀
事務A修改資料之后提交了資料“name=L”,然后事務B就讀取資料,但是此時A覺得修改的資料不滿意“name=H”,繼續修改提交了,此時事務B再次讀取,發現,啊,怎么資料不一樣了,這就是不可重復讀的問題,
解決辦法:給寫操作加鎖的同時,給讀操作也加鎖,當事務A在寫的時候,事務B不可以讀,事物B在讀的時候,事物A也不可以寫,
幻讀
雖然已經給寫操作加鎖,和讀操作加鎖,但是會有種情況,事務B在讀的時候,事務A無法修改name,但是事務A可以再寫一個age,當事務B再次讀取資料的時候發現,咦,怎么多了條資料,
解決辦法:只能嚴格的串行化執行,(并發程度最低,效率也最低,但是資料的可靠性最高)
這里很容易搞混不可重復讀和幻讀,其實只需要理解,不可重復讀是修改資料,資料的條數不變;幻讀是增加或者洗掉資料,資料的內容不變,條數發生改變,
MySQL的隔離級別
讀未提交(read-uncommitted):會有臟讀,不可重復讀,幻讀問題
不可重復讀(read-committed):會有不可重復讀,幻讀問題
可重復讀(repeatable-read):會有幻讀問題
串行化 (serializable):解決這三個問題
事務的隔離級別并不是越高越好,但事務的隔離級別越高,那么并發性就越低,效率越低,資料的可靠性就會越高,
MySQL8開始,用SELECT@@GLOBAL.transaction_isolation,@@transaction_isolation;查詢隔離級別(這里是是MySQL5)

這里我們可以看到MySQL的全域隔離級別和當前會話隔離級別皆是REPEATABLE一READ(可重復讀),不同的資料庫有不同的默認隔離級別,而且我們也可以自行修改它,
通過如下命令可以修改隔離級別(建議在修改時修改當前 session 隔離級別即可,不用修改全域的隔離級別):
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
注意,如果只是修改了當前 session 的隔離級別,則換一個 session 之后,隔離級別又會恢復到默認的隔離級別,所以我們測驗時,修改當前 session 的隔離級別即可,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/400554.html
標籤:java
上一篇:JAVA 網路編程
下一篇:Java圖形化界面編程
