MySQL事務隔離級別的型別

2021-10-06 07:50:21 字數 1577 閱讀 2592

1. 事務隔離級別型別以及序列化介紹

事務的隔離性是多個使用者併發訪問資料庫時,資料庫為每乙個使用者開啟的事務,不能被其他事務的運算元據所干擾,多個併發事務之間要相互隔離。 在併發下事務會容易出現一些問題:

髒讀 :乙個事務開始讀取了某行資料,另外乙個事務已經更新了此資料但沒有能夠及時提交。這是相當危險的,因為很可能所有的操作都被回滾。

個人理解:開啟兩個事務查詢同一條資料,第乙個事務查詢了並更新了資料,但是沒有提交,第二個事務查詢的卻是第乙個事務已經更新的資料,沒有提交事務卻讀到了更新後的資料,所以這就是髒讀,不符事務的一致性。

不可重複讀:乙個事務對同一行資料重複讀取兩次,但是卻得到了不同的結果。例如,在兩次讀取的中途,有另外乙個事務對該型資料進行了修改,並提

交。幻讀:事務在操作過程中進行兩次查詢,第二次查詢的結果包含了第一次查詢中未出現的資料(sql不一定一樣)。

這是因為在兩次查詢過程中有另外乙個 事務插入資料 在mysql中存在(innodb)事務存在著4中隔離級別,不同的隔離級別對事務的處理不同。

事務的4種隔離級別:

未授權讀取(未提交讀 read uncommitted):read-uncommitted | 0:存在髒讀,不可重複讀,幻讀的問題。如果乙個事務已經開始寫資料,則另外乙個資料則不會允許同時進行寫操作,但允許其他事務讀此行資料。隔離級別可以通過「排他寫鎖」實現。

授權讀取(已讀提交 read committed):read-committed | 1:解決髒讀的問題,存在不可重複讀,幻讀的問題。這個可以通過「排他寫鎖」實現。讀取資料的事務允許其他事務繼續訪問該行資料,但是未提交的寫事務將會禁止其他事務訪問該行。

可重複讀取(repeatable read):repeatable-read | 2:解決髒讀,不可重複讀的問題,存在幻讀的問題,預設隔離級別。可通過「共享鎖」,「排他鎖」實現。讀取資料的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事務。

序列化(serializable):serializable | 3:解決髒讀,不可重複讀,幻讀,可保證事務安全,但完全序列執行,效能最低。提供嚴格的事務隔離。它要求事務序列化執行,事務只能乙個接著乙個地執行,不能併發執行。如果僅僅通過「行級鎖」是無法實現事務序列化的,必須要通過其他機制保證新插入的資料不會被剛執行查詢操作的事務訪問到。

查詢事務的隔離級別

show global variables like "%transaction_isolation%"  | global是全域性查詢  區域性查詢用session

設定隔離級別

set @@global.transaction_isolation =0  設定為ru級別

檢視io的消耗

show engine innodb status \g

檢視鎖等待的時間

show variables like 'innodb_lock_wait_timeout'

判斷事務的大小

事務裡面執行的sql語句多少,insert和update比select 大

mysql遇到死鎖,會把事務大的執行了,事務小的進行回滾

MySQL事務隔離級別的實現原理

在mysql的眾多儲存引擎中,只有innodb支援事務,所有這裡說的事務隔離級別指的是innodb下的事務隔離級別。讀未提交 乙個事務可以讀取到另乙個事務未提交的修改。這會帶來髒讀 幻讀 不可重複讀問題。基本沒用 讀已提交 乙個事務只能讀取另乙個事務已經提交的修改。其避免了髒讀,但仍然存在不可重複讀...

MySQL事務隔離級別的實現原理

在mysql的眾多儲存引擎中,只有innodb支援事務,所有這裡說的事務隔離級別指的是innodb下的事務隔離級別。讀未提交 乙個事務可以讀取到另乙個事務未提交的修改。這會帶來髒讀 幻讀 不可重複讀問題。基本沒用 讀已提交 乙個事務只能讀取另乙個事務已經提交的修改。其避免了髒讀,但仍然存在不可重複讀...

mysql 事務隔離級別的實現原理

目錄 一 事務的四要素 acid 二 mysql的事務的隔離級別 三 多版本併發控制 multi version concurrency control 3.1 功能 3.2 原理 1.原子性 atomicity all done 或者 all not done 2.一致性 consistency ...