MySQL事務與隔離級別的使用基礎理論
目錄
- 什么是事務
- 事務四大特性ACID
- 并發事務問題
- 臟讀
- 不可重復讀
- 幻讀
- 事務隔離級別
什么是事務
事務就是一組操作的集合,事務將整組操作作為一個整體,共同提交或者共同撤銷
這些操作只能同時成功或者同時失敗,成功即可提交事務,失敗就執行事務回滾
MySQL的事務默認是自動提交的,一條語句執行成功,MySQL將會隱式的提交事務
以轉賬為例,張三向李四轉賬1000元
這個整體行為包含三個操作:首先查詢張三賬戶的余額,其次將張三賬戶余額-1000,最后將李四賬戶余額+1000。事務就是將這三個操作看作最小提交單元,就是一榮俱榮一損俱損。
-- 查看事務管理狀態 1-自動 0-手動select @@autocommit;-- 設置事務手動管理set @@autocommit = 0;-- 開啟事務start transaction;-- 開啟事務:start transaction 或者 beginselect money from account where name = "張三";update account set money = money - 1000 where name = "張三";update account set money = money + 1000 where name = "李四";-- 事務提交commit;-- 事務回滾rollback;
事務四大特性ACID
原子性Atomicity:一組操作為最小執行單元,只能全部執行成功或者全部失敗
一致性Consistency:事務完成后,所有數據都要保持一致狀態
一致性表示事務完成后,數據操作前后符合邏輯運算,狀態一致
隔離性Isolation:是指在并發操作數據庫時,各個事務之間不會相互影響
持久性Durability:事務一旦提交或回滾,對于數據庫的修改將會永久保存
并發事務問題
臟讀
兩個事務A和B在并發下操作數據庫中的同一數據時,當事務A對數據進行了修改但是還沒有commit的同時,事務B對該數據進行了select,此時事務B讀取到的數據就是不準確的。這種情況叫做臟讀
事務B讀取到了事務A修改但還未提交的數據---->臟讀
不可重復讀
同樣事務AB并發下操作數據庫中同一數據,首先事務A對該數據進行查詢,查詢之后又進行了其他操作。與此同時,事務B執行了更新操作并且成功commit。那么當事務A再次對數據庫查詢的時候就會出現與上次讀取到的數據不一致的情況
幻讀
事務AB并發下操作數據庫中同一數據,事務A首先查詢了數據庫中是否有id=1的數據,沒有就插入。那么此時事務A未查詢到該數據存在,同時事務B執行了插入操作插入了id=1的數據并且提交。那么事務A再去插入的時候則會報主鍵沖突的錯誤,但是當事務A再一次去查的時候發現id=1的數據仍然是不存在( 前提是已經解決了不可重復讀的問題,一個事務多次訪問同一數據的結果是一致的 ),這種情況就稱之為幻讀
事務隔離級別
隔離級別
× --> 無法解決 √ --> 可以解決
在sql中查看當前事務隔離級別
select @@transaction_isolation;
設置當前事務隔離級別
-- 設置事務隔離級別set [session|global] transaction isolation level {Read uncommitted | Read committed | Repeatable Read |Serializable};
session是指盡在當前會話中使用該事務隔離級別,global表示全局有效
四種事務隔離級別當中,Serializable可序化級別最高。要求序列化執行sql指令,事務只能一個接一個的執行,不允許并發執行。性能低下
而Read Uncommitted讀未提交性能最好,但是存在臟讀問題等
到此這篇關于MySQL事務與隔離級別的使用基礎理論的文章就介紹到這了,更多相關MySQL事務與隔離級別內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!
相關文章:
