一:事務概念
- acid(atomicity、consistency、isolation、durability,即原子性、一致性、隔離性、永續性)
二:事務產生的問題
- 多個事務同時執行的時候
- 髒讀(dirty read)
- 不可重複讀(non-repeatable read)
- 幻讀(phantom read)的問題
- 為了解決這些問題,就有了「隔離級別」的概念。
三:隔離級別
- 首先隔離越高,效率就會越低。
- 因此很多時候,我們都要在二者之間尋找乙個平衡點。
- sql 標準的事務隔離級別包括
- 讀未提交(read uncommitted)
- 讀提交(read committed)
- 可重複讀(repeatable read)
- 和序列化(serializable )
四:隔離級別的具體表現
- 在乙個事務下
- 若隔離級別是「讀未提交」
- 則 v1 的值就是 2。這時候事務 b 雖然還沒有提交,但是結果已經被 a 看到了。因此,v2、v3 也都是 2。
- 若隔離級別是「讀提交」
- 則 v1 是 1,v2 的值是 2。事務 b 的更新在提交後才能被 a 看到。所以, v3 的值也是 2。
- 若隔離級別是「可重複讀」
- 則 v1、v2 是 1,v3 是 2。之所以 v2 還是 1,遵循的就是這個要求:事務在執行期間看到的資料前後必須是一致的。
- 若隔離級別是「序列化」
- 則在事務 b 執行「將 1 改成 2」的時候,會被鎖住。直到事務 a 提交後,事務 b 才可以繼續執行。所以從 a 的角度看, v1、v2 值是 1,v3 的值是 2。
五:隔離的實現
- 在 mysql 中,實際上每條記錄在更新的時候都會同時記錄一條回滾操作。記錄上的最新值,通過回滾操作,都可以得到前乙個狀態的值。
- 假設乙個值從 1 被按順序改成了 2、3、4,在回滾日誌裡面就會有類似下面的記錄。
- 當前值是 4,但是在查詢這條記錄的時候,不同時刻啟動的事務會有不同的 read-view
- 同一條記錄在系統中可以存在多個版本,就是資料庫的多版本併發控制(mvcc)。
- 在系統判斷沒有早於這個 read-view 的日誌,這個回滾日誌既會刪除。
六:長事務
- 長事務意味著系統裡面會存在很老的事務檢視。
- 由於這些事務隨時可能訪問資料庫裡面的任何資料,所以這個事務提交之前,資料庫裡面它可能用到的回滾記錄都必須保留,這就會導致大量占用儲存空間。
- 除了對回滾段的影響,長事務還占用鎖資源,也可能拖垮整個庫。
七:如何監控和減少長事務的產生?
- 設定autocommit=1,另外,編寫乙個定時監控innodb_trx表中時間比較大的事務的任務
- 可以在information_schema 庫的 innodb_trx 這個表中查詢長事務,比如下面這個語句,用於查詢持續時間超過 60s 的事務。
-select * from information_schema.innodb_trx where time_to_sec(timediff(now(),trx_started))>60
mysql事務隔離最高 Mysql事務隔離級別
mysql官方文件顯示 innodb中每個隔離級別的詳細描述如下 read uncommitted select語句以非鎖定方式被執行,但是乙個可能更早期版本的記錄會被用到。因此,使用這個隔離級別,比如,讀是不連貫的。著也被稱為 髒讀 dirty read 另外,這個隔離級別象read commit...
MySQL 事務隔離
未提交讀 read uncommitted 允許髒讀,也就是可能讀取到其他會話中未提交事務修改的資料 提交讀 read committed 只能讀取到已經提交的資料。oracle等多數資料庫預設都是該級別 不重複讀 可重複讀 repeated read 可重複讀。在同乙個事務內的查詢都是事務開始時刻...
Mysql 事務隔離
1 事務的特性 原子性 一致性 隔離性 永續性 2 多事務同時執行的時候,可能會出現的問題 髒讀 不可重複讀 幻讀 3 事務隔離級別 讀未提交 讀提交 可重複讀 序列化 4 不同事務隔離級別的區別 讀未提交 乙個事務還未提交,它所做的變更就可以被別的事務看到 讀提交 乙個事務提交之後,它所做的變更才...