mysql資料庫隔離級別

2022-07-03 20:54:13 字數 1662 閱讀 4368

事務的隔離級別 (由高到低)

1.序列化(serializable):乙個事務乙個事務的執行

2.可重複讀(repeatable-read) 可重複讀,無論其他事務是否修改並提交了資料,在這個事務中看到的資料值始終不受其他事務影響  (mysql資料庫所預設的級別)

3.讀已提交(read committed)  讀取已提交,其他事務提交了對資料的修改後,本事務就能讀取到修改後的資料值(大多數資料庫預設的隔離級別)

4.讀未提交:(read uncommitted)  讀取未提交,其他事務只要修改了資料,即使未提交,本事務也能看到修改後的資料值。

結合實際流程理解一下:

序列化就是乙個事務乙個事務的執行。乙個事務未執行完畢,另乙個事務不能執行。例如上面的購買商品流程。使用者a購買商品時,開始乙個事務。在這個事務未執行完的時候,使用者b不能開始事務。

可重複讀就是乙個事務裡,無論查詢多少遍,都是一樣的結果,即使另乙個事務對資料進行了更改,查到的結果也是永遠一樣。例如,使用者a開始了事務,查詢商品的庫存為3。即使使用者b這時候開始事務,然後完成了事務,修改了庫存,提交了事務。但是使用者a的事務在查詢商品的庫存永遠都是3,並不會因為使用者b的事務更改了庫存而更新資料。它是獨立於乙個事務的。mysql預設的隔離級別就是可重複讀。

讀已提交是其他事務提交了對資料的修改後,本事務就能讀取到修改後的資料值。

例如,使用者a開始了事務,查詢商品資料是3。這時候,使用者b開始了事務,修改了商品庫存為1,並且事務提交了。這時候a的事務再查詢庫存的時候,庫存不再是3了,而是1。

很多資料庫的預設隔離級別都是讀已提交。

讀未提交是其他事務只要修改了資料,即使未提交,本事務也能看到修改後的資料值。例如,使用者a開始了事務,查詢商品庫存是3。這時候使用者b開始了事務,先修改了商品庫存為1,但是還沒有提交。即使這樣,使用者a的事務再查詢商品庫存時,查到的庫存也是1。

在用樂觀鎖的時候,必須要把mysql的隔離級別設定為讀已提交。

ubuntu下的設定方法:

1. 使用vi開啟mysql配置檔案

sudo vi /etc/mysql/mysql.conf.d/mysqld.cnf

2. 在檔案的最末尾新增如下配置, 指定mysql資料庫的隔離級別為read-committed,如下圖

# 可選引數有:read-uncommitted, read-committed, repeatable-read, serializable.

transaction-isolation=read-committed

3. 在終端中重啟mysql服務

sudo service mysql restart

1. 進入mysql終端

2. 檢視當前事務隔離級別

select @@global.tx_isolation;

3. 設定隔離級別,可選的引數read uncommitted  | repeatable read | serializable

set global transaction isolation level read committed;

MySQL資料庫的隔離級別

問題 innodb 如果乙個session a開啟事務讀一條資料,另乙個session b開啟事務更新這條資料,那麼b能夠順序提交嗎?a又讀到的是什麼值呢?mysql預設情況下,答案為 b可以立即更改這個記錄,但是a始終都讀的是b修改前的資料,即使b已經提交了。a只有提交了之後,再select,就看...

mysql資料庫事務隔離級別

1修改事務隔離級別 全域性修改 修改mysql.ini配置檔案 mysqlid transaction isolation repeatble read 對當前session修改 登入mysql客戶端後,執行命令set session transaction isolation level read...

MYSQL 資料庫 事務 隔離級別

定義 在資料庫 中,為了有效保證併發讀取資料的正確性,提出的事務隔離級別,由低到高依次為 1 read uncommitted 未授權讀取 讀未提交 2 read committed 授權讀取 讀提交 3 repeatable read 可重複讀取 4 serializable 序列化 這四個事務隔...