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

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

10年的銀川網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。營銷型網(wǎng)站建設(shè)的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整銀川建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。創(chuàng)新互聯(lián)從事“銀川網(wǎng)站設(shè)計”,“銀川網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。

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ù)庫的默認隔離級別。當一個事務(wù)在執(zhí)行過程中,數(shù)據(jù)被另外一個事務(wù)修改,造成本次事務(wù)前后讀取的信息不一樣,這種情況稱為不可重復(fù)讀。
  • PEPEATABLE READ(可重復(fù)讀):這個級別是MySQL的默認隔離級別,它解決了臟讀的問題,同時也保證了同一個事務(wù)多次讀取同樣的記錄是一致的,但這個級別還是會出現(xiàn)幻讀的情況?;米x是指當一個事務(wù)A讀取某一個范圍的數(shù)據(jù)時,另一個事務(wù)B在這個范圍插入行,A事務(wù)再次讀取這個范圍的數(shù)據(jù)時,會產(chǎn)生幻行。特別說明:InnoDB和XtraDB存儲引擎通過多版本并發(fā)控制(MVCC,Multiversion Concurrency Control)解決了幻讀問題,它使用間隙鎖(next-key locking)鎖定查詢涉及的行和索引中的間隙,防止幻影行的插入。
  • SERIALIZABLE(可串行化):這個事務(wù)是最高的隔離級別,它強制事務(wù)串行執(zhí)行,避免了幻讀問題。簡單來說,SERIALIZABLE會在讀取的每一行數(shù)據(jù)上都加鎖,所以可能會導(dǎo)致大量的超時和鎖競爭
隔離級別臟讀可能性不可重復(fù)度可能性幻讀可能性加鎖讀
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'; // 設(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ù)默認使用數(shù)據(jù)庫的隔離級別,可以通過注解@Transactional中的isolation參數(shù)調(diào)整Session級的隔離級別。隔離級別是會話級別的,JDBC的java.sql.Connection接口支持隔離級別的設(shè)置。

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

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

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

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

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

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í)行第二條update語句,卻發(fā)現(xiàn)記錄已被對方鎖定,然后2個事務(wù)都等待對方釋放資源,同時持有對方需要的鎖,這樣就會出現(xiàn)死循環(huán)。

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

看完上述內(nèi)容,是不是對如何實現(xiàn)MySQL事務(wù)及Spring隔離級別有進一步的了解,如果還想學(xué)習(xí)更多內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

本文題目:如何實現(xiàn)MySQL事務(wù)及Spring隔離級別
分享鏈接:http://bm7419.com/article34/jdcose.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、網(wǎng)站建設(shè)商城網(wǎng)站、網(wǎng)站設(shè)計公司、虛擬主機

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)