站長資訊網
        最全最豐富的資訊網站

        MySQL事務的ACID特性及并發問題知識點總結

        本篇文章給大家帶來了關于mysql的相關知識,主要介紹了MySQL事務的ACID特性以及并發問題方案,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下,希望對大家有幫助。

        MySQL事務的ACID特性及并發問題知識點總結

        推薦學習:mysql視頻教程

        一、事務的概念

        一個事務是由一條或多條對數據庫操作的SQL語句所組成的一個不可分割的單元,只有當事務中所有操作都正常執行完了,整個事務才會被提交給數據庫,如果有部分事務處理失敗,那么事務就要回滾到最初的狀態,因此,事務要么全部執行成功,要么全部失敗。

        所以要記住事務幾個基本概念,如下:

        事務是一組SQL語句的執行,要么全部成功,要么全部失敗,不能出現部分成功,部分失敗的結果,保證事務執行的原子操作。事務的所有SQL語句全部執行成功,才能提交(commit)事務,把結果寫會磁盤上。事務執行過程中,有的SQL出現錯誤,那么事務必須要回滾(rollback)到最初的狀態。

        比如轉賬業務需要多條SQL語句共同完成,只有這些SQL都執行成功才算業務成功了。

        MySQL事務的ACID特性及并發問題知識點總結

        事務處理有三個狀態:

        begin:開啟一個事務要執行的全部sql語句都成功了,然后commit提交一個事務如果其中任何一條SQL語句由于停電、或者服務器出錯,導致SQL執行異常,那事務就沒有提交,事務會回滾(rollback),數據將恢復到事務開始前的狀態

        這是存儲引擎來保證的(redo log和undo log保證的)

        MySQL事務的ACID特性及并發問題知識點總結

        MyISAM存儲引擎不支持事務,InnoDB存儲引擎支持事務、支持行鎖。

        show enginesG查看當前數據庫支持哪些存儲引擎。

        MySQL事務的ACID特性及并發問題知識點總結

        select @@autocommit;查看對事務提交狀態的設置

        MySQL事務的ACID特性及并發問題知識點總結

        數據庫引擎可以通過命令臨時修改,或者通過配置文件永久修改。

        如果說我們業務上涉及了事務,我們一般會在代碼上控制這個變量,一般來說,我們的事務由多條SQL組成,要滿足事務的原子性操作,所以我們設置為手動提交。業務都成功,則提交這個事務;如果業務中間出現失敗,就回滾1個事務。

        MySQL事務的ACID特性及并發問題知識點總結

        二、ACID特性

        每一個事務必須滿足下面的4個特性:

        事務的原子性(Atomic):事務是一個不可分割的整體,事務必須具有原子特性,及當事務修改時,要么全執行,要么全不執行,即不允許事務部分的完成。事務的一致性(Consistency):一個事務執行之前和執行之后,數據庫數據必須保持一致性狀態。數據庫的一致性狀態必須由用戶來負責,由并發控制機制實現。就拿網上購物來說,你只有讓商品出庫,又讓商品進入顧客的購物車才能構成一個完整的事務。(一致性不僅僅體現在事務里面,包括存儲層引入MySQL為了提高熱點數據的訪問效率一般都會加一個緩存層Redis或者Memery cache對熱點數據做緩存,這就涉及了緩存層和數據庫DB層的數據一致性問題)事務的隔離性(Isolution):當兩個或多個事務并發執行時,為了保證數據的安全性,將一個事務內部的操作與其他事務的操作隔離起來,不被其他正在執行的事務所看到,使得并發執行的各個事務之間不能互相影響。隔離級別:數據的安全性和事務的并發性。隔離越嚴格,安全性越高,并發性越低(就是并發控制,保證數據安全)事務的持久性(Durability):事務完成以后(事務commit成功),DBMS保證它對數據庫中的數據的修改時永久性的,即使數據庫因為故障出錯,也應該能夠恢復數據。

        MySQL事務的ACID特性及并發問題知識點總結

        MySQL最重要的是日志,不是數據!

        事務的ACD特性是由MySQL的redo log和undo log機制來保證的;I隔離性是由mysql事務的鎖機制來實現保證的。

        三、事務并發存在的問題

        事務處理不經隔離,并發執行事務時通常會發生以下問題:

        臟讀(Dirty Read):一個事務讀取了另一個事務未提交的數據。例如當事務A和事務B并發執行時,當事務A更新后,事務B查詢讀取到A尚未提交的數據,此時事務A回滾,則事務B讀到的數據就是無效的臟數據(事務B讀取了事務A尚未提交的數據不可重復讀(NonRepeatable Read):一個事務的操作導致另一個事務前后兩次讀到不同的數據。例如當事務A和事務B并發執行時,當事務B查詢讀取數據后,事務A更新操作更改事務B查詢到的數據,此時事務B再去讀該數據,發現前后兩次讀的數據不一樣。(事務B讀取了事務A已提交的數據虛讀(Phantom Read)幻讀:一個事務的操作導致另一個事務前后兩次查詢的結果數據量不同。例如當事務A和事務B并發執行時,當事務B查詢讀取數據后,事務A新增或者刪除了一條滿足事務B查詢條件的記錄,此時事務B再去查詢,發現查詢到前一次不存在的記錄,或者前一次查詢的一些記錄不見了。(事務B讀取了事務A新增加的數據或者讀不到事務A刪除的數據

        臟讀必須杜絕,因為事務沒有commit。在有些場景下,不可重復讀和幻讀是可以允許的(事務已經commit),不一定非要杜絕(通過設置不同的隔離級別解決),由應用場景需求決定。

        四、事務相關命令

        select @@autocommit;查看MySQL是否自動提交事務

        MySQL事務的ACID特性及并發問題知識點總結

        0表示手動提交事務,1表示自動提交事務,設置事務提交方式為手動提交(只影響當前session):

        MySQL事務的ACID特性及并發問題知識點總結

        MySQL事務的ACID特性及并發問題知識點總結

        推薦學習:mysql視頻教程

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 久久精品国产只有精品2020| 惠民福利中文字幕人妻无码乱精品| 国产亚洲欧洲精品| 四虎国产精品成人| 欧美精品香蕉在线观看网| 日韩人妻无码精品久久免费一| 国产这里有精品| 亚洲精品免费视频| 国产精品后入内射日本在线观看| 在线观看91精品国产网站| 国产精品无码久久四虎| 国产成人精品精品欧美| 久久精品麻豆日日躁夜夜躁| 午夜三级国产精品理论三级| 精品久久久久久99人妻| 2024最新国产精品一区| 九九热这里只有在线精品视| 久久精品人人槡人妻人人玩AV| 中文国产成人精品久久不卡| 久久久久亚洲精品无码网址 | 99精品免费视频| 久久夜色精品国产网站| 亚洲欧洲精品成人久久曰影片| 日本欧美国产精品第一页久久| 国内精品欧美久久精品| 国产2021久久精品| 杨幂国产精品福利在线观看| 精品国产网红福利在线观看| 国产精品亚洲成在人线| 久久久久亚洲精品天堂| 亚洲精品二区国产综合野狼| 亚洲国产精品一区二区三区久久| 久久露脸国产精品| 久久精品这里只有精99品| 久久精品国产亚洲5555| 久久久久人妻一区精品果冻| 老年人精品视频在线| 日本精品一区二区久久久| 欧美成人精品高清视频在线观看 | 久久国产精品99精品国产| 亚洲AV成人精品一区二区三区|