您好,登錄后才能下訂單哦!
這篇文章主要介紹“MySQL事務與隔離級別如何使用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“MySQL事務與隔離級別如何使用”文章能幫助大家解決問題。
事務就是一組操作的集合,事務將整組操作作為一個整體,共同提交或者共同撤銷
這些操作只能同時成功或者同時失敗,成功即可提交事務,失敗就執行事務回滾
MySQL的事務默認是自動提交的,一條語句執行成功,MySQL將會隱式的提交事務
以轉賬為例,張三向李四轉賬1000元
這個整體行為包含三個操作:首先查詢張三賬戶的余額,其次將張三賬戶余額-1000,最后將李四賬戶余額+1000。事務就是將這三個操作看作最小提交單元,就是一榮俱榮一損俱損。
-- 查看事務管理狀態 1-自動 0-手動 select @@autocommit; -- 設置事務手動管理 set @@autocommit = 0; -- 開啟事務 start transaction; -- 開啟事務:start transaction 或者 begin select money from account where name = '張三'; update account set money = money - 1000 where name = '張三'; update account set money = money + 1000 where name = '李四'; -- 事務提交 commit; -- 事務回滾 rollback;
原子性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的數據仍然是不存在( 前提是已經解決了不可重復讀的問題,一個事務多次訪問同一數據的結果是一致的 ),這種情況就稱之為幻讀
隔離級別
隔離級別 | 臟讀 | 不可重復讀 | 幻讀 |
---|---|---|---|
Read uncommitted(讀未提交) | × | × | × |
Read committed(oracle默認)(讀已提交) | √ | × | × |
Repeatable Read(mysql默認)(可重復讀) | √ | √ | × |
Serializable(可序化) | √ | √ | √ |
× --> 無法解決 √ --> 可以解決
在sql中查看當前事務隔離級別
select @@transaction_isolation;
設置當前事務隔離級別
-- 設置事務隔離級別 set [session|global] transaction isolation level {Read uncommitted | Read committed | Repeatable Read |Serializable};
session是指盡在當前會話中使用該事務隔離級別,global表示全局有效
四種事務隔離級別當中,Serializable可序化級別最高。要求序列化執行sql指令,事務只能一個接一個的執行,不允許并發執行。性能低下,而Read Uncommitted讀未提交性能最好,但是存在臟讀問題等。
關于“MySQL事務與隔離級別如何使用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。