日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql事务实战_MySQL - 实战 (2) - 事务隔离

發布時間:2025/3/15 数据库 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql事务实战_MySQL - 实战 (2) - 事务隔离 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

MySQL - 實戰 (2) - 事務隔離

1 事務相關概念

MySQL 中,事務支持是在引擎層實現的

MySQL 是一個支持多引擎的系統,但并不是所有的引擎都支持事務

MySQL 原生的 MyISAM 引擎就不支持事務,這也是 MyISAM 被 InnoDB 取代的重要原因之一

2 隔離級別

2.1 數據庫多事務同時執行時可能產生的問題:

臟讀(dirty read)

讀到其他事務未提交的數據

幻讀(phantom read)

前后讀取的記錄內容不一致

不可重復讀(non-repeatable read)

前后讀取的記錄數量不一致

隔離級別越高效率越低

2.2 隔離級別

讀未提交(read uncommitted)

讀未提交是指,一個事務還沒提交時,它做的變更就能被別的事務看到

讀提交(read committed)

讀提交是指,一個事務提交之后,它做的變更才會被其他事務看到

可重復讀(repeatable read)

可重復讀是指,一個事務執行過程中看到的數據,總是跟這個事務在啟動時看到的數據是一致的。當然在可重復讀隔離級別下,未提交變更對其他事務也是不可見的

串行化(serializable )

串行化,顧名思義是對于同一行記錄,“寫”會加“寫鎖”,“讀”會加“讀鎖”。當出現讀寫鎖沖突的時候,后訪問的事務必須等前一個事務執行完成,才能繼續執行

在實現上,數據庫里面會創建一個視圖,訪問的時候以視圖的邏輯結果為準。在“可重復讀”隔離級別下,這個視圖是在事務啟動時創建的,整個事務存在期間都用這個視圖。在“讀提交”隔離級別下,這個視圖是在每個 SQL 語句開始執行的時候創建的。這里需要注意的是,“讀未提交”隔離級別下直接返回記錄上的最新值,沒有視圖概念;而“串行化”隔離級別下直接用加鎖的方式來避免并行訪問

2.3 事務隔離的實現

在 MySQL 中,實際上每條記錄在更新的時候都會同時記錄一條回滾操作 (undo log)。記錄上的最新值,通過回滾操作,都可以得到前一個狀態的值

同一條記錄在系統中可以存在多個版本,就是數據庫的多版本并發控制(MVCC)

回滾日志在不需要的時候才刪除,即當系統里沒有比這個回滾日志更早的 read-view 的時候

2.4 長事務

2.4.1 盡量避免使用長事務

長事務意味著系統里面會存在很老的事務視圖。由于這些事務隨時可能訪問數據庫里面的任何數據,所以這個事務提交之前,數據庫里面它可能用到的回滾記錄都必須保留,這就會導致大量占用存儲空間

在 MySQL 5.5 及以前的版本,回滾日志是跟數據字典一起放在 ibdata 文件里的,即使長事務最終提交,回滾段被清理,文件也不會變小

長事務還占用鎖資源

2.5 事務的啟動方式

2.5.1 方式一:顯示啟動

顯式啟動事務語句, begin 或 start transaction。配套的提交語句是 commit,回滾語句是 rollback

2.5.2 方式二

set autocommit=0,這個命令會將這個線程的自動提交關掉。意味著如果你只執行一個 select 語句,這個事務就啟動了,而且并不會自動提交。這個事務持續存在直到你主動執行 commit 或 rollback 語句,或者斷開連接

有些客戶端連接框架會默認連接成功后先執行一個 set autocommit=0 的命令。這就導致接下來的查詢都在事務中,如果是長連接,就導致了意外的長事務

使用 set autocommit=1, 通過顯式語句的方式來啟動事務

2.5.3 解決多一次交互問題

在 autocommit 為 1 的情況下,用 begin 顯式啟動的事務

執行 commit work and chain,則是提交事務并自動啟動下一個事務

2.5.4 查詢長事務

information_schema 庫的 innodb_trx 這個表中查詢長事務

示例:查詢持續時間超過60s的長事務

select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60

3 問題自我總結

1.事務的概念是什么?

2.mysql的事務隔離級別讀未提交, 讀已提交, 可重復讀, 串行各是什么意思?

3.讀已提交, 可重復讀是怎么通過視圖構建實現的?

4.可重復讀的使用場景舉例? 對賬的時候應該很有用?

5.事務隔離是怎么通過read-view(讀視圖)實現的?

6.并發版本控制(MCVV)的概念是什么, 是怎么實現的?

7.使用長事務的弊病? 為什么使用常事務可能拖垮整個庫?

8.事務的啟動方式有哪幾種?

9.commit work and chain的語法是做什么用的?

10.怎么查詢各個表中的長事務?

11.如何避免長事務的出現?

總結

以上是生活随笔為你收集整理的mysql事务实战_MySQL - 实战 (2) - 事务隔离的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。