MySQL系列(二)---MySQL事務


MySql 事務

目錄

目錄

什么是事務(transaction)

  • 保證成批操作要么完全執行,要么完全不執行,維護數據的完整性。也就是要么成功要么失敗。
  • 事務可以是n條sql語句(n>=0)
  • 不是所有數據庫引擎支持事務,InnoDB引擎支持事務處理

事務四大特性

  • 原子性(Atomic):事務的所有所有操作要么全部執行,要么全部不執行。如果中途出現錯誤不會停止,而是回滾到事務前的狀態
  • 一致性(Consistency):如果事務執行前是一致的,那么執行后也是一致的,不能破壞關系數據的完整性以及業務邏輯上的一致性,事務按照預期實現。
  • 隔離性(Isolation):隔離性可以防止多個事務並發時導致數據的不一致
  • 持久性(Durability):事務執行成功后對數據庫的修改是永久的

事務並發不進行事務隔離

  • 臟讀:事務A讀到未提交事務B修改的數據,如果此時事務B中途執行失敗回滾,那么此時事務A讀取到的就是臟數據。比如事務A對money進行修改,此時事務B讀取到事務A的更新結果,但是如果后面事務A回滾,那么事務B讀取到的就是臟數據了。
  • 不可重復讀:同一個事務中,對同一份數據讀取的結果不一致。事務A在事務B對數據更新前進行讀取,然后事務B更新提交,事務A再次讀取,這時候兩次讀取的數據不同。
  • 幻讀:同一個事務中,同一個查詢多次返回的結果不一樣。事務B查詢表的記錄數,然后事務A對表插入一條記錄,接着事務B再次查詢發現記錄數不同。

區別

  • 臟讀和不可重復讀:臟讀是事務讀取了還未提交事務的更新數據。不可重復讀是同一個事務中,幾次讀取的數據不同。
  • 不可重復讀和幻讀的區別:都是在同一個事務中,前者是幾次讀取數據不同,后者是幾次讀取數據整體不同。

隔離級別

隔離級別 作用
Serializable(串行化) 避免臟讀、不可重復讀、幻讀
Repeatable(可重復讀) 避免臟讀、不可重復讀
Read committed(讀已提交) 避免臟讀
Read uncommitted(讀未提交) none
  • mysql支持上面4種隔離級別,默認為可重復讀

事務的使用

start transcation;
delete from user;
savepoint dele;
****
rollback dele;
commit;
  • transcation 事務開始
  • rollback 回滾到事務起點
  • savepoint 保留回滾位置
  • rollback point_name 回滾到設置的位置

使用注意點

  • 如果事務中sql正確運行,后面沒有commit,結果是不會更新到數據庫的,所以需要手動添加commit。
  • 如果事務中部分sql語句出現錯誤,那么錯誤語句后面不會執行。而我們可能會認為正確操作會回滾撤銷,但是實際上並沒有撤銷正確的操作,此時如果再無錯情況下進行一次commit,之前的正確操作會生效,數據庫會進行更新。

我覺得分享是一種精神,分享是我的樂趣所在,不是說我覺得我講得一定是對的,我講得可能很多是不對的,但是我希望我講的東西是我人生的體驗和思考,是給很多人反思,也許給你一秒鍾、半秒鍾,哪怕說一句話有點道理,引發自己內心的感觸,這就是我最大的價值。(這是我喜歡的一句話,也是我寫博客的初衷)

作者:jiajun 出處: http://www.cnblogs.com/-new/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。如果覺得還有幫助的話,可以點一下右下角的【推薦】,希望能夠持續的為大家帶來好的技術文章!想跟我一起進步么?那就【關注】我吧。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM