中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL InnoDB 事務

發布時間:2020-05-20 18:42:36 來源:網絡 閱讀:244 作者:wx5dbbe78024a3e 欄目:MySQL數據庫

事務的定義

事務:數據庫操作的最小工作單元,是作為單個邏輯工作單元執行的一系列操作; 事務是一組不可再分割的操作集合(工作邏輯單元)。

典型事務使用場景:轉賬

MySQL InnoDB 事務
MySQL 開啟事務:

MySQL InnoDB 事務
MySQL 默認是開啟事務的,通過 SHOW VARIABLES like 'autocommit'; 可以查看 MySQL 的事務開啟情況。

在 autocommit = ON(自動提交事務)的情況下,可以執行 BEGIN; 或者 START TRANSACTION; 命令,改為手動提交事務,執行完 SQL 語句后,需要通過 COMMIT 命令提交事務,或者通過 ROLLBACK 命令回滾事務。
在 autocommit = OFF(手動提交事務)的情況下,執行完 SQL 語句后,需要通過 COMMIT 命令提交事務,或者通過 ROLLBACK命令回滾事務。
JDBC 編程:

MySQL InnoDB 事務
測試命令:

MySQL InnoDB 事務
事務 ACID 特性

原子性(Atomicity):最小的工作單元,整個工作單元要么一起提交成功,要么全部失敗回滾。

一致性(Consistency):事務中操作的數據及狀態改變是一致的,即寫入資料的結果必須完全符合預設的規則,不會因為出現系統意外等原因導致狀態的不一致。

隔離型(Isolation):一個事務所操作的數據在提交之前,對其他事務的可見性設定(一般設定為不可見)。

持久性(Durability):事務所做的修改就會永久保存,不會因為系統意外導致數據的丟失。

參考(原子性和一致性的區別是什么?)這篇博文,講了一下原子性和一致性的區別。

事務并發帶來了哪些問題

臟讀

MySQL InnoDB 事務MySQL InnoDB 事務
比如 user 表中有一條用戶數據,執行了如下操作:

事務B更新 id=1 的數據,age 更新為18,不提交事務
事務A查詢 id=1 的數據
事務B回滾剛才的更新操作
這個時候,事務A中查詢出的 id=1 的數據,age 的值是16還是18?

不可重復讀

MySQL InnoDB 事務
比如 user 表中有一條用戶數據,執行了如下操作:

事務A查詢 id=1 的數據
事務B更新 id=1 的數據,age 更新為18,并提交事務
事務A再次查詢 id=1 的數據
這個時候,事務A兩次查詢出的 id=1 的數據,age 的值是16還是18?

幻讀

MySQL InnoDB 事務
比如在 user 表中執行了如下操作:

事務A查詢 age>15 的數據
事務B新增一條數據,age=22,并提交事務
事務A再次查詢 age>15 的數據
這個時候,事務A兩次查詢出的數據,數量是1條還是2條?

事務四種隔離級別

SQL92 ANSI/ISO標準:http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt

Read Uncommitted(未提交讀) --未解決并發問題

事務未提交對其他事務也是可見的,臟讀(dirty read)

Read Committed(提交讀) --解決臟讀問題

一個事務開始之后,只能看到自己提交的事務所做的修改,不可重復讀(non repeatable read)

Repeatable Read(可重復讀) --解決不可重復讀問題

在同一個事務中多次讀取同樣的數據結果是一樣的,這種隔離級別未定義解決幻讀的問題

Serializable(串行化) --解決所有問題

最高的隔離級別,通過強制事務的串行執行

InnoDB 引擎對隔離級別的支持程度

MySQL InnoDB 事務
事務隔離級別的并發能力:未提交讀 > 已提交讀 > 可重復讀 > 串行化

InnDB 引擎默認的事務隔離級別是可重復讀(Repeatable Read),在該級別中它把幻讀的問題也解決了。InnDB 中事務隔離級別通過鎖、MVCC 實現。

通過如下語句查看 InnoDB 的默認事務隔離級別:

MySQL InnoDB 事務MySQL InnoDB 事務
MySQL InnoDB 事務MySQL InnoDB 事務
通過如下語句設置 InnoDB 的事務隔離級別:

MySQL InnoDB 事務MySQL InnoDB 事務
接下來我們來測試一下 InnoDB 的默認事務隔離級別(Repeatable Read)是否解決了臟讀、不可重復讀、幻讀的問題。

數據準備:

MySQL InnoDB 事務MySQL InnoDB 事務
是否解決了臟讀的問題?

MySQL InnoDB 事務MySQL InnoDB 事務
開啟兩個 MySQL 客戶端,模擬事務A和事務B的操作,執行步驟如下:

事務B開啟手動事務,更新 id=1 的數據,age 更新為18,不提交事務
事務A查詢 id=1 的數據
事務B回滾剛才的更新操作
圖中的數字是執行步驟,通過下圖可以看出事務A的執行結果是16,InnDB 的默認事務隔離級別完美的解決了臟讀的問題。

MySQL InnoDB 事務MySQL InnoDB 事務
是否解決了不可重復讀的問題?

MySQL InnoDB 事務MySQL InnoDB 事務
開啟兩個 MySQL 客戶端,模擬事務A和事務B的操作,執行步驟如下:

事務A開啟手動事務,查詢 id=1 的數據
事務B更新 id=1 的數據,age 更新為18,并提交事務
事務A再次查詢 id=1 的數據
圖中的數字是執行步驟,通過下圖可以看出事務A兩次的執行結果都是16,沒有受事務B更新操作的影響,InnDB 的默認事務隔離級別完美的解決了不可重復讀的問題。

MySQL InnoDB 事務MySQL InnoDB 事務
是否解決了幻讀的問題?

MySQL InnoDB 事務MySQL InnoDB 事務
開啟兩個 MySQL 客戶端,模擬事務A和事務B的操作,執行步驟如下:

事務A開啟手動事務,查詢 age>15 的數據
事務B新增一條數據,age=22,并提交事務
事務A再次查詢 age>15 的數據
圖中的數字是執行步驟,通過下圖可以看出事務A兩次的執行結果都是一條數據,沒有受事務B新增操作的影響,InnDB 的默認事務隔離級別完美的解決了幻讀的問題。

MySQL InnoDB 事務MySQL InnoDB 事務

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

淅川县| 平阳县| 融水| 徐闻县| 斗六市| 穆棱市| 当雄县| 大理市| 晴隆县| 漯河市| 宁海县| 宾川县| 如东县| 德阳市| 灵宝市| 西充县| 绍兴市| 西安市| 文水县| 威远县| 壤塘县| 金平| 营口市| 钦州市| 容城县| 普陀区| 惠州市| 大理市| 都江堰市| 任丘市| 交城县| 朝阳市| 临泉县| 万年县| 南安市| 鄱阳县| 永昌县| 和平区| 南投县| 江陵县| 五寨县|