色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁技術文章
文章詳情頁

MySQL事務及Spring隔離級別實現原理詳解

瀏覽:43日期:2023-02-06 15:01:25

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 UNCONMITED Yes Yes Yes No RED COMMITED No Yes Yes No REPEATABLE READ No No Yes No SERIALIZABLE No No No Yes

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

show variables like ’tx_isolation’; # 查看隔離級別,MySQL8以前show variables like ’transaction_isolation’; # 查看隔離級別,MySQL8set 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處理死鎖的方式是:將持有最少行級排他鎖的事務進行回滾。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Spring
相關文章:
主站蜘蛛池模板: 岛国伊人| 欧美粗又大gay69视频 | 中文字幕精品一区二区三区视频 | 亚洲国内精品自在线影视 | 91网站国产 | 国产一级小视频 | 玖玖玖视频在线观看视频6 玖玖影院在线观看 | 久久天天躁综合夜夜黑人鲁色 | 久久久不卡国产精品一区二区 | 九九综合九九 | 欧美高清性刺激毛片 | 日韩三级在线播放 | 亚洲国产欧美在线人成aaa | 国产a级三级三级三级中国 国产a级特黄的片子视频 | 在线99| 正在播放国产大学生情侣 | 国产高颜值露脸在线观看 | 国产97视频| 成人欧美精品久久久久影院 | 高清国产一区 | 一级成人黄色片 | 成年人免费小视频 | 国产系列在线播放 | 大狠狠大臿蕉香蕉大视频 | 亚洲综合一 | 欧美一级毛片免费播放aa | 91精品国产免费久久久久久青草 | 99精品久久精品一区二区 | 涩涩国产精品福利在线观看 | 日本三级11k影院在线 | 国产1000部成人免费视频 | 一级久久| 欧美视频一区二区三区 | 免费一看一级毛片全播放 | 看性过程三级视频在线观看 | 亚洲精品日韩中文字幕久久久 | 寡妇一级a毛片免费播放 | 三级全黄的视频 | 国产成人久久精品麻豆二区 | 4四虎44虎www在线影院麻豆 | 久久视频这里只有精品 |