久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

MySQL事務的ACID特性及并發問題實例分析

143次閱讀
沒有評論

共計 2187 個字符,預計需要花費 6 分鐘才能閱讀完成。

本篇內容主要講解“MySQL 事務的 ACID 特性及并發問題實例分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓丸趣 TV 小編來帶大家學習“MySQL 事務的 ACID 特性及并發問題實例分析”吧!

一、事務的概念

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

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

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

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

事務處理有三個狀態:

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

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

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

用 show engines\G 查看當前數據庫支持哪些存儲引擎。

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

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

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

二、ACID 特性

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

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

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 是否自動提交事務

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

到此,相信大家對“MySQL 事務的 ACID 特性及并發問題實例分析”有了更深的了解,不妨來實際操作一番吧!這里是丸趣 TV 網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-07-13發表,共計2187字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 苏尼特左旗| 大姚县| 抚远县| 绥宁县| 达日县| 元朗区| 台中市| 沧州市| 安西县| 思茅市| 会同县| 芦山县| 保康县| 山阴县| 芮城县| 方城县| 平陆县| 晋江市| 砚山县| 宁陕县| 绥滨县| 沙洋县| 夏河县| 顺平县| 南城县| 和平县| 海南省| 民乐县| 房山区| 清苑县| 奈曼旗| 玉田县| 南开区| 望谟县| 察隅县| 四川省| 化隆| 万州区| 南澳县| 绥化市| 莎车县|