国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

如何實現(xiàn)MySQL事務(wù)及Spring隔離級別

2024-07-24 12:36:15
字體:
供稿:網(wǎng)友
  這篇文章主要講解了如何實現(xiàn)MySQL事務(wù)及Spring隔離級別,內(nèi)容清晰明了,對此有興趣的小伙伴可以學(xué)習(xí)一下,相信大家閱讀完之后會有幫助。
 
  1、事務(wù)具有ACID特性
 
  原子性(atomicity):一個事務(wù)被事務(wù)不可分割的最小工作單元,要么全部提交,要么全部失敗回滾。
  一致性(consistency):數(shù)據(jù)庫總是從一致性狀態(tài)到另一個一致性狀態(tài),它只包含成功事務(wù)提交的結(jié)果
  隔離型(isolation):事務(wù)所做的修改在最終提交一起,對其他事務(wù)是不可見的
  持久性(durability):一旦事務(wù)提交,則其所做的修改就會永久保存到數(shù)據(jù)庫中。
  
  2、事務(wù)的隔離級別
 
  1)隔離級別的定義與問題
 
  READ UNCOMMITTED(讀未提交):事務(wù)的修改,即使沒有提交,對其他事務(wù)也都是可見的。事務(wù)能夠讀取未提交的數(shù)據(jù),這種情況稱為臟讀。
  READ COMMITTED(讀已提交):事務(wù)讀取已提交的數(shù)據(jù),大多數(shù)數(shù)據(jù)庫的默認(rèn)隔離級別。當(dāng)一個事務(wù)在執(zhí)行過程中,數(shù)據(jù)被另外一個事務(wù)修改,造成本次事務(wù)前后讀取的信息不一樣,這種情況稱為不可重復(fù)讀。
  PEPEATABLE READ(可重復(fù)讀):這個級別是MySQL的默認(rèn)隔離級別,它解決了臟讀的問題,同時也保證了同一個事務(wù)多次讀取同樣的記錄是一致的,但這個級別還是會出現(xiàn)幻讀的情況?;米x是指當(dāng)一個事務(wù)A讀取某一個范圍的數(shù)據(jù)時,另一個事務(wù)B在這個范圍插入行,A事務(wù)再次讀取這個范圍的數(shù)據(jù)時,會產(chǎn)生幻行。特別說明:InnoDB和XtraDB存儲引擎通過多版本并發(fā)控制(MVCC,Multiversion Concurrency Control)解決了幻讀問題,它使用間隙鎖(next-key locking)鎖定查詢涉及的行和索引中的間隙,防止幻影行的插入。
  SERIALIZABLE(可串行化):這個事務(wù)是最高的隔離級別,它強(qiáng)制事務(wù)串行執(zhí)行,避免了幻讀問題。簡單來說,SERIALIZABLE會在讀取的每一行數(shù)據(jù)上都加鎖,所以可能會導(dǎo)致大量的超時和鎖競爭
  隔離級別 臟讀可能性 不可重復(fù)度可能性 幻讀可能性 加鎖讀
  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'; # 查看隔離級別,MySQL8
 
  set global transaction_isolation='READ-COMMITTED'; // 設(shè)置隔離級別,閥域READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE
  事務(wù)的隔離級別可以是Session層的,我們可以對不同的Session設(shè)置不同級別:
 
  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事務(wù)隔離級別
 
  Spring事務(wù)默認(rèn)使用數(shù)據(jù)庫的隔離級別,可以通過注解@Transactional中的isolation參數(shù)調(diào)整Session級的隔離級別。隔離級別是會話級別的,JDBC的java.sql.Connection接口支持隔離級別的設(shè)置。
 
  Spring在開啟事務(wù)時(DataSourceTransactionManager.doBegin),根據(jù)注解配置,對Connection的隔離級別進(jìn)行設(shè)置:
 
  MySQL驅(qū)動com.mysql.cj.jdbc.ConnectionImpl執(zhí)行SQL語句調(diào)整會話級的隔離級別
 
  3、死鎖
 
  死鎖是指兩個或多個事務(wù)在同一資源上相互占用,并請求鎖定對方占用的資源,從而導(dǎo)致惡性循環(huán)。死鎖示例:
 
  # 事務(wù)一
  start transaction;
  update account set money=10 where id=1;
  update account set money=20 where id=2;
  commit;
 
  # 事務(wù)二
  start transaction;
  update account set money=10 where id=2;
  update account set money=20 where id=1;
  commit;
  假設(shè)碰巧,事務(wù)一和事務(wù)二同時執(zhí)行完第一個update語句,接著準(zhǔn)備執(zhí)行第二條update語句,卻發(fā)現(xiàn)記錄已被對方鎖定,然后2個事務(wù)都等待對方釋放資源,同時持有對方需要的鎖,這樣就會出現(xiàn)死循環(huán)。
 
  為了避免死鎖問題,數(shù)據(jù)庫實現(xiàn)了各種死鎖檢測和死鎖超長機(jī)制,InnoDB處理死鎖的方式是:將持有最少行級排他鎖的事務(wù)進(jìn)行回滾。

(編輯:武林網(wǎng))

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 共和县| 巫山县| 岱山县| 洪洞县| 南部县| 深泽县| 增城市| 诸城市| 时尚| 腾冲县| 东宁县| 安远县| 洛隆县| 革吉县| 务川| 嘉祥县| 西林县| 娄底市| 芒康县| 肥城市| 海淀区| 宁城县| 天峻县| 乐山市| 桑植县| 松溪县| 体育| 桃园市| 石屏县| 介休市| 纳雍县| 漯河市| 昭觉县| 盘山县| 滁州市| 宝清县| 永济市| 乌鲁木齐县| 天峨县| 海安县| 石景山区|