MySQL系列(二)
阿新 • • 發佈:2017-08-02
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系列(二)