MySQL 實戰 2 事務隔離

2022-06-15 07:12:12 字數 1600 閱讀 8339

目錄2.5 事務的啟動方式

3 問題自我總結

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 方式一:顯示啟動

2.5.2 方式二

2.5.3 解決多一次互動問題

2.5.4 查詢長事務

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

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

select * from information_schema.innodb_trx where time_to_sec(timediff(now(),trx_started))>60
1.事務的概念是什麼?

2.mysql的事務隔離級別讀未提交, 讀已提交, 可重複讀, 序列各是什麼意思?

3.讀已提交, 可重複讀是怎麼通過檢視構建實現的?

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

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

6.併發版本控制(mcvv)的概念是什麼, 是怎麼實現的?

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

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

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

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

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

MySQL實戰45講之2 事務隔離級別

讀未提交 別人改資料的事務尚未提交,我在我的事務中也能讀到。讀已提交 別人改資料的事務已經提交,我在我的事務中才能讀到。可重複讀 別人改資料的事務已經提交,我在我的事務中也不去讀。序列 我的事務尚未提交,別人就別想改資料。這4種隔離級別,並行效能依次降低,安全性依次提高。在實現上,資料庫裡面會建立乙...

mysql事務隔離最高 Mysql事務隔離級別

mysql官方文件顯示 innodb中每個隔離級別的詳細描述如下 read uncommitted select語句以非鎖定方式被執行,但是乙個可能更早期版本的記錄會被用到。因此,使用這個隔離級別,比如,讀是不連貫的。著也被稱為 髒讀 dirty read 另外,這個隔離級別象read commit...

3 (mysql實戰) 事務隔離

提到事務,你肯定不陌生,和資料庫打交道的時候,我們總是會用到事務。最經典的例子就是轉賬,你要給朋友小王轉 100 塊錢,而此時你的銀行卡只有 100 塊錢。轉賬過程具體到程式裡會有一系列的操作,比如查詢餘額 做加減法 更新餘額等,這些操作必須保證是一體的,不然等程式查完之後,還沒做減法之前,你這 1...