事務隔離主要是針對ACID中的 I 隔離性設定的,在了解這幾種資料庫事務之前需要先了解幾個重要概念:
-
臟讀 - 事務1(READ)訪問了事務2(WRITE)未提交的事務

-
幻讀 - 一個事務讀取了2次,得到的結果不一樣

-
不可重復讀 - 一個事務讀取同一條記錄2次,得到的結果不一致

為了解決上面的三個問題,有四種資料庫隔離級別
-
READ UNCOMMITTED
故名思義,讀未提交,允許臟讀,當然也會出現不可重復讀和幻讀,可以通過“排他寫鎖”實作,在表對某行進行修改時,會對該行加上行共享鎖
-
READ COMMITTED
讀提交,允許不可重復讀取,但不允許臟讀取,這可以通過“瞬間共享讀鎖”和“排他寫鎖”實作,讀取資料的事務允許其他事務繼續訪問該行資料,但是未提交的寫事務將會禁止其他事務訪問該行,在本事務未提交之前其他事務的增刪改操作提交后會影響讀的結果, 讀的是最新結果 ,在對表進行修改時,會對表資料行加上行共享鎖
-
Repeatable Read
可重復讀,禁止不可重復讀取和臟讀取,但是有時可能出現幻讀資料,這可以通過“共享讀鎖”和“排他寫鎖”實作,讀取資料的事務將會禁止寫事務(但允許讀事務),寫事務則禁止任何其他事務,讀的是快照結果,MysQL 默認級別,通過MVCC解決了幻讀問題,在事務中對某條記錄修改,會對記錄加上行共享鎖,直到事務結束才會釋放,
-
Serializable
序列化,提供嚴格的事務隔離,它要求事務序列化執行,事務只能一個接著一個地執行,不能并發執行,僅僅通過“行級鎖”是無法實作事務序列化的,必須通過其他機制保證新插入的資料不會被剛執行查詢操作的事務訪問到,
進行查詢時就會對表或行加上共享鎖,其他事務對該表將只能進行讀操作,而不能進行寫操作,

事務隔離級別越高,資料的完整性和一致性越好,但會影響并發性能,mysql默認使用 Repeatable Read 級別,而aliyun rds 默認使用 READ COMMITTED,
查看查詢資料庫隔離級別
select @@global.tx_isolation;
Mysql 8.0 以上需要使用
select @@transaction_isolation;
修改事務隔離級別:mysql.ini
#可選引數有:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.
[mysqld]
transaction-isolation = REPEATABLE-READ
當然,也可以只對當前session修改
mysql> set session transaction isolation level read uncommited;
鎖機制
共享鎖:由讀表操作加上的鎖,加鎖后其他用戶只能獲取該表或行的共享鎖,不能獲取排它鎖,也就是說只能讀不能寫
排它鎖:由寫表操作加上的鎖,加鎖后其他用戶不能獲取該表或行的任何鎖,典型是mysql事務中的
鎖的范圍:
行鎖: 對某行記錄加上鎖
表鎖: 對整個表加上鎖
本文由 歧途老農 創作,采用 CC BY 4.0 CN 協議 進行許可, 可自由轉載、參考,但需署名作者且注明文章出處,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/144252.html
標籤:Java
