一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - MySQL事務及Spring隔離級別實現原理詳解

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

2021-01-18 14:30玄同太子 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 unconmited yes yes yes no
red commited no yes yes no
repeatable read no no yes no
serializable no no no yes

 

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

?
1
2
3
4
show variables like 'tx_isolation';  # 查看隔離級別,mysql8以前
show variables like 'transaction_isolation'; # 查看隔離級別,mysql8
 
set global transaction_isolation='read-committed'; // 設置隔離級別,閥域read-uncommittedread-committedrepeatable-readserializable

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

?
1
2
3
4
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、死鎖

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

?
1
2
3
4
5
6
7
8
9
10
11
# 事務一
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處理死鎖的方式是:將持有最少行級排他鎖的事務進行回滾。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:https://www.cnblogs.com/zhi-leaf/p/12807249.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: fuqer日本 | 国产精品一区二区国产 | 亚洲国产99在线精品一区69堂 | 午夜伦伦电影理论片大片 | 国偷盗摄自产福利一区在线 | 午夜小视频免费观看 | 爆操| 亚洲免费在线观看 | 精品国产美女AV久久久久 | 毛片资源| 欧美一区二区三区高清不卡tv | 亚洲熟区 | 国产剧情在线播放 | 动漫人物差差差动漫人物免费观看 | 饭冈加奈子在线播放观看 | 国产精品2 | 538亚洲欧美国产日韩在线精品 | 久久综合久综合久久鬼色 | 午夜久久免影院欧洲 | 香蕉91xj.cc| 成人久久18免费网站 | 国产乱子伦一区二区三区 | 亚洲精品国产精品精 | 香蕉成人国产精品免费看网站 | 精品久久99麻豆蜜桃666 | 国产成人精品实拍在线 | 夫妻性生活一级黄色片 | 亚洲精品电影天堂网 | 秋霞717理论片在线观看 | 无删减影视免费观看 | 男男同gayxxx | 青青草人人 | 亚洲系列第一页 | 色吧导航 | 国产麻豆精品入口在线观看 | 撕开老师的丝袜白丝扒开粉嫩的小 | 日韩在线天堂 | www.日本视频| 天海翼最新 | 午夜精品久视频在线观看 | 亚洲欧美国产自拍 |