《Mysql 事務 隔離》

2022-05-02 08:51:12 字數 1978 閱讀 6657

一:事務概念

-  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 不同事務隔離級別的區別 讀未提交 乙個事務還未提交,它所做的變更就可以被別的事務看到 讀提交 乙個事務提交之後,它所做的變更才...