1. 程式人生 > >MySQL系列(二)

MySQL系列(二)

sql read 註意 出現 back 總結 lba 區別 不同

MySql 事務

目錄

  • MySQL系列(一):基礎知識大總結
  • 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,之前的正確操作會生效,數據庫會進行更新。

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

MySQL系列(二)