激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術(shù)|

服務器之家 - 數(shù)據(jù)庫 - Mysql - MySQL事務及Spring隔離級別實現(xiàn)原理詳解

MySQL事務及Spring隔離級別實現(xiàn)原理詳解

2021-01-18 14:30玄同太子 Mysql

這篇文章主要介紹了MySQL事務及Spring隔離級別實現(xiàn)原理詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

1、事務具有acid特性

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

2、事務的隔離級別

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

  • read uncommitted(讀未提交):事務的修改,即使沒有提交,對其他事務也都是可見的。事務能夠讀取未提交的數(shù)據(jù),這種情況稱為臟讀。
  • read committed(讀已提交):事務讀取已提交的數(shù)據(jù),大多數(shù)數(shù)據(jù)庫的默認隔離級別。當一個事務在執(zhí)行過程中,數(shù)據(jù)被另外一個事務修改,造成本次事務前后讀取的信息不一樣,這種情況稱為不可重復讀。
  • pepeatable read(可重復讀):這個級別是mysql的默認隔離級別,它解決了臟讀的問題,同時也保證了同一個事務多次讀取同樣的記錄是一致的,但這個級別還是會出現(xiàn)幻讀的情況。幻讀是指當一個事務a讀取某一個范圍的數(shù)據(jù)時,另一個事務b在這個范圍插入行,a事務再次讀取這個范圍的數(shù)據(jù)時,會產(chǎn)生幻行。特別說明:innodb和xtradb存儲引擎通過多版本并發(fā)控制(mvcc,multiversion concurrency control)解決了幻讀問題,它使用間隙鎖(next-key locking)鎖定查詢涉及的行和索引中的間隙,防止幻影行的插入。
  • serializable(可串行化):這個事務是最高的隔離級別,它強制事務串行執(zhí)行,避免了幻讀問題。簡單來說,serializable會在讀取的每一行數(shù)據(jù)上都加鎖,所以可能會導致大量的超時和鎖競爭

 

隔離級別 臟讀可能性 不可重復度可能性 幻讀可能性 加鎖讀
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事務默認使用數(shù)據(jù)庫的隔離級別,可以通過注解@transactional中的isolation參數(shù)調(diào)整session級的隔離級別。隔離級別是會話級別的,jdbc的java.sql.connection接口支持隔離級別的設置。

MySQL事務及Spring隔離級別實現(xiàn)原理詳解

spring在開啟事務時(datasourcetransactionmanager.dobegin),根據(jù)注解配置,對connection的隔離級別進行設置:

MySQL事務及Spring隔離級別實現(xiàn)原理詳解

mysql驅(qū)動com.mysql.cj.jdbc.connectionimpl執(zhí)行sql語句調(diào)整會話級的隔離級別

MySQL事務及Spring隔離級別實現(xiàn)原理詳解

3、死鎖

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

?
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;

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

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

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

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

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 久色免费 | 久久精品亚洲一区二区 | 久久国产精品久久久久久 | 99久久99视频 | 妇女毛片 | 国产精品久久久久久久久久东京 | 国产精品九九久久一区hh | 国产精品自拍av | 久久久久久久久久综合 | 精品在线免费播放 | 男人久久天堂 | 亚洲国产女同久久 | 国产精品一区二av18款 | 99久久久久久久 | 欧美一区二区三区成人精品 | 一区二区三视频 | 美女视频在线观看黄 | 一二区成人影院电影网 | 暴力肉体进入hdxxxx0 | 国产一级一片免费播放 | 国产高潮失禁喷水爽到抽搐视频 | 国产一区二区影视 | 中国女警察一级毛片视频 | 久久国产精品久久久久久电车 | 国产色片 | 国产成人精品网站 | 国产二三区| 免费午夜网站 | 国产成人精品午夜视频' | 国产精品区在线12p 午夜视频在线免费播放 | 日本中文字幕网址 | 天堂成人一区二区三区 | 国产99久久久久久免费看 | 成人午夜精品久久久久久久蜜臀 | 日本在线看| 久久久久亚洲a | 国产在线精品一区二区三区 | 欧美国产日韩在线 | 国产精品色综合 | 悠悠成人资源亚洲一区二区 | 国产成人精品一区在线播放 |