mysql數據庫隔離級別


# 原創,轉載請留言聯系

事務的隔離級別 (由高到低)
1.串行化(serializable):一個事務一個事務的執行
2.可重復讀(Repeatable-Read) 可重復讀,無論其他事務是否修改並提交了數據,在這個事務中看到的數據值始終不受其他事務影響  (mysql數據庫所默認的級別)
3.讀已提交(Read Committed)  讀取已提交,其他事務提交了對數據的修改后,本事務就能讀取到修改后的數據值(大多數數據庫默認的隔離級別)
4.讀未提交:(Read Uncommitted)  讀取未提交,其他事務只要修改了數據,即使未提交,本事務也能看到修改后的數據值。

 

結合實際流程理解一下:

 

1.串行化 serializable

串行化就是一個事務一個事務的執行。一個事務未執行完畢,另一個事務不能執行。例如上面的購買商品流程。用戶A購買商品時,開始一個事務。在這個事務未執行完的時候,用戶B不能開始事務。

 

2.可重復讀 Repeatable-Read

可重復讀就是一個事務里,無論查找多少遍,都是一樣的結果,即使另一個事務對數據進行了更改,查到的結果也是永遠一樣。例如,用戶A開始了事務,查詢商品的庫存為3。即使用戶B這時候開始事務,然后完成了事務,修改了庫存,提交了事務。但是用戶A的事務在查詢商品的庫存永遠都是3,並不會因為用戶B的事務更改了庫存而更新數據。它是獨立於一個事務的。Mysql默認的隔離級別就是可重復讀。

 

3.讀已提交 Read Committed

讀已提交是其他事務提交了對數據的修改后,本事務就能讀取到修改后的數據值。

例如,用戶A開始了事務,查詢商品數據是3。這時候,用戶B開始了事務,修改了商品庫存為1,並且事務提交了。這時候A的事務再查詢庫存的時候,庫存不再是3了,而是1。

很多數據庫的默認隔離級別都是讀已提交。

 

4.讀未提交 Read Uncommitted

讀未提交是其他事務只要修改了數據,即使未提交,本事務也能看到修改后的數據值。例如,用戶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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM