91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何實現MySQL事務及Spring隔離級別

發布時間:2020-07-27 11:47:37 來源:億速云 閱讀:197 作者:小豬 欄目:MySQL數據庫

這篇文章主要講解了如何實現MySQL事務及Spring隔離級別,內容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。

1、事務具有ACID特性

  • 原子性(atomicity):一個事務被事務不可分割的最小工作單元,要么全部提交,要么全部失敗回滾。
  • 一致性(consistency):數據庫總是從一致性狀態到另一個一致性狀態,它只包含成功事務提交的結果
  • 隔離型(isolation):事務所做的修改在最終提交一起,對其他事務是不可見的
  • 持久性(durability):一旦事務提交,則其所做的修改就會永久保存到數據庫中。
     

2、事務的隔離級別

1)隔離級別的定義與問題

  • READ UNCOMMITTED(讀未提交):事務的修改,即使沒有提交,對其他事務也都是可見的。事務能夠讀取未提交的數據,這種情況稱為臟讀。
  • READ COMMITTED(讀已提交):事務讀取已提交的數據,大多數數據庫的默認隔離級別。當一個事務在執行過程中,數據被另外一個事務修改,造成本次事務前后讀取的信息不一樣,這種情況稱為不可重復讀。
  • PEPEATABLE READ(可重復讀):這個級別是MySQL的默認隔離級別,它解決了臟讀的問題,同時也保證了同一個事務多次讀取同樣的記錄是一致的,但這個級別還是會出現幻讀的情況。幻讀是指當一個事務A讀取某一個范圍的數據時,另一個事務B在這個范圍插入行,A事務再次讀取這個范圍的數據時,會產生幻行。特別說明:InnoDB和XtraDB存儲引擎通過多版本并發控制(MVCC,Multiversion Concurrency Control)解決了幻讀問題,它使用間隙鎖(next-key locking)鎖定查詢涉及的行和索引中的間隙,防止幻影行的插入。
  • SERIALIZABLE(可串行化):這個事務是最高的隔離級別,它強制事務串行執行,避免了幻讀問題。簡單來說,SERIALIZABLE會在讀取的每一行數據上都加鎖,所以可能會導致大量的超時和鎖競爭
隔離級別臟讀可能性不可重復度可能性幻讀可能性加鎖讀
READ UNCONMITEDYesYesYesNo
RED COMMITEDNoYesYesNo
REPEATABLE READNoNoYesNo
SERIALIZABLENoNoNoYes

2)如果查看修改和MySQL的隔離級別

show variables like 'tx_isolation';  # 查看隔離級別,MySQL8以前
show variables like 'transaction_isolation'; # 查看隔離級別,MySQL8

set global transaction_isolation='READ-COMMITTED'; // 設置隔離級別,閥域READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE

事務的隔離級別可以是Session層的,我們可以對不同的Session設置不同級別:

set session transaction isolation level read uncommitted;
set session transaction isolation level read committed;
set session transaction isolation level repeatable read;
set session transaction isolation level serializable;

3)Spring事務隔離級別

Spring事務默認使用數據庫的隔離級別,可以通過注解@Transactional中的isolation參數調整Session級的隔離級別。隔離級別是會話級別的,JDBC的java.sql.Connection接口支持隔離級別的設置。

如何實現MySQL事務及Spring隔離級別

Spring在開啟事務時(DataSourceTransactionManager.doBegin),根據注解配置,對Connection的隔離級別進行設置:

如何實現MySQL事務及Spring隔離級別

MySQL驅動com.mysql.cj.jdbc.ConnectionImpl執行SQL語句調整會話級的隔離級別

如何實現MySQL事務及Spring隔離級別

3、死鎖

死鎖是指兩個或多個事務在同一資源上相互占用,并請求鎖定對方占用的資源,從而導致惡性循環。死鎖示例:

# 事務一
start transaction;
update account set money=10 where id=1;
update account set money=20 where id=2;
commit;

# 事務二
start transaction;
update account set money=10 where id=2;
update account set money=20 where id=1;
commit;

假設碰巧,事務一和事務二同時執行完第一個update語句,接著準備執行第二條update語句,卻發現記錄已被對方鎖定,然后2個事務都等待對方釋放資源,同時持有對方需要的鎖,這樣就會出現死循環。

為了避免死鎖問題,數據庫實現了各種死鎖檢測和死鎖超長機制,InnoDB處理死鎖的方式是:將持有最少行級排他鎖的事務進行回滾。

看完上述內容,是不是對如何實現MySQL事務及Spring隔離級別有進一步的了解,如果還想學習更多內容,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

祁门县| 榕江县| 康定县| 盘锦市| 库车县| 宽甸| 茶陵县| 通海县| 区。| 长寿区| 老河口市| 曲靖市| 依兰县| 莒南县| 武平县| 琼结县| 安达市| 峨眉山市| 镇赉县| 土默特右旗| 延长县| 桑植县| 威信县| 天水市| 衡阳市| 许昌县| 达尔| 铁岭县| 克东县| 湖南省| 河池市| 大邑县| 嵊泗县| 莱州市| 梧州市| 安义县| 祁阳县| 稻城县| 无为县| 志丹县| 太湖县|