您好,登錄后才能下訂單哦!
本篇內容介紹了“java事務、事務的隔離級別的概念是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
事務,即數據庫事務。是數據庫管理系統執行過程中的一個邏輯單位,由一個有限的數據庫操作序列構成。
通常,事務的正確執行會使數據庫從一種狀態轉換為另一種狀態。
原子性(atomicity) 即不可分割性,事務要么全執行、要么全不執行。
一致性(consistency) 事務的執行使得數據庫從一種正確狀態轉換成另外一種正確狀態。
隔離性(isolation) 在事務正確提交之前,不允許把事務對該數據的改變提供給任何其他事務。
持久性(durability) 事務正確提交之后,其結果將永遠保存在數據庫之中。
并發狀態解釋為當事務A和事務B對同一資源進行操作時,可能會遇到很多的問題。
即事務A讀到了事務B還沒有提交的數據。如果事務A對數據進行了更新,但是事務A并沒有提交,但是事務B這個時候看到了事務A沒有提交的更新。當事務A進行了回滾,那么剛剛事務B看到的數據就是臟數據。也就是臟讀。
例子:
A 給 B 轉了100萬,但是 A 還沒有提交,此時 B 查詢自己賬戶,多了100萬。然后 A 發現轉錯人了,回滾了事物。然后 B 100萬就沒了。在這個過程中 B 查到了沒有提交的數據(多出的100萬),這就是臟讀。
即同一事務在事務執行過程中對同一個數據進行了多次讀取,但是每一次讀取的數據結果都不相同。原因是在兩次讀取間隔,數據別其他人修改了,導致了統一事務兩次讀取結果不一致。
例子:
A 查詢銀行余額為100萬,B 這個時候取走了50萬,此時余額變成了50萬,A 再一次查詢余額,變成了50萬。對 A 而言兩次結果不一致就是不可重復讀。
即在事務 A 多次讀取數據集的過程中中,事務 B 對數據進行了新增操作或者刪除操作,導致事務 A 多次讀取的數據集不一致。
例子:
A 修改當前公司所有職員信息的時候,B 向其中插入了一個新的職員,這個時候 A 提交的時候發現了一個自己沒有修改過的職員的信息,對 A 而言就像是產生了幻覺。
為了應對上面并發情況下出現的問題,事務的隔離級別就產生了。當事務的隔離級別越高的時候,上面的問題就會越少,但是性能消耗也會越大。所以在實際生產過程中,要根據需求去確定隔離級別。
讀未提交,即能夠讀取到沒有被提交的數據,所以很明顯這個級別的隔離機制無法解決臟讀、不可重復讀、幻讀中的任何一種。
已提交,即能夠讀到那些已經提交的數據,能夠防止臟讀,但是無法解決不可重復讀和幻讀的問題。
重復讀取,即在數據讀出來之后加鎖,類似”select * from XXX for update”,明確數據讀取出來就是為了更新用的,所以要加一把鎖,防止別人修改它。REPEATABLE_READ的意思也類似,讀取了一條數據,這個事務不結束,別的事務就不可以改這條記錄,這樣就解決了臟讀、不可重復讀的問題,但是幻讀的問題還是無法解決。
串行化,最高的事務隔離級別,不管多少事務,挨個運行完一個事務的所有子事務之后才可以執行另外一個事務里面的所有子事務,這樣就解決了臟讀、不可重復讀和幻讀的問題了。
“java事務、事務的隔離級別的概念是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。