溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

Mysql事務(wù)是什么意思

發(fā)布時(shí)間:2021-06-25 09:29:51 來(lái)源:億速云 閱讀:147 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“Mysql事務(wù)是什么意思”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Mysql事務(wù)是什么意思”吧!

上一篇著重談到了MySQL鎖的概念,里面談到了事務(wù)的概念,其實(shí)大部分開(kāi)發(fā)者對(duì)于事務(wù)肯定不陌生,事務(wù)的概念其實(shí)就是一組SQL語(yǔ)句組成一個(gè)執(zhí)行單元,如果單元中的某個(gè)SQL語(yǔ)句執(zhí)行出現(xiàn)異常,則需要將整個(gè)事務(wù)進(jìn)行回滾到未修改的狀態(tài)。只有單元中全部SQL語(yǔ)句都成功執(zhí)行,才會(huì)提交數(shù)據(jù)代表事務(wù)執(zhí)行成功。而Mysql其實(shí)前幾篇我們都已經(jīng)知道是支持多種存儲(chǔ)引擎的,其實(shí)正是因?yàn)镸yISAM引擎不支持事務(wù)被InnoDB取代的原因。所以本篇文章主要是針對(duì)InnoDB引擎詳細(xì)了解下事務(wù)這個(gè)概念。

事務(wù)特性

  • 原子性: 事務(wù)是一個(gè)原子操作單元,其對(duì)數(shù)據(jù)的修改,要么全都執(zhí)行,要么全都不執(zhí)行。

  • 一致性:事務(wù)中包含的處理要滿(mǎn)足數(shù)據(jù)庫(kù)提前設(shè)置的約束,如主鍵約束或者NOT NULL 約束等。

  • 隔離性:事務(wù)處理過(guò)程中的中間狀態(tài)對(duì)外部是不可見(jiàn)的。

  • 持久性:事務(wù)完成之后,它對(duì)于數(shù)據(jù)的修改是永久性的。

隔離性的四種隔離級(jí)別

InnoDB引擎支持的4種事務(wù)隔離級(jí)別分別是:讀未提交、讀已提交、可重復(fù)讀、串行讀。

  • 讀未提交:允許臟讀,可以讀取其他session中未提交的臟數(shù)據(jù)。

  • 讀已提交:不可讀取其他session尚未提交的數(shù)據(jù),只有其他session數(shù)據(jù)已提交才能讀取到,為不重復(fù)讀。

  • 可重復(fù)讀:該級(jí)別下可重復(fù)讀,InnoDB引擎默認(rèn)采用可重復(fù)讀,不允許讀取還未提交的臟數(shù)據(jù),但是可能存在InnoDB獨(dú)有的幻讀。

  • 串行讀:該級(jí)別下隔離程度最高,事務(wù)只能一個(gè)接著一個(gè)串行執(zhí)行,無(wú)法并發(fā)執(zhí)行。每次串行讀都需要獲得表級(jí)共享鎖,讀寫(xiě)操作都會(huì)阻塞。

幻讀

事務(wù)在插入一條已經(jīng)經(jīng)過(guò)檢查不存在的記錄,但是插入結(jié)果是數(shù)據(jù)已經(jīng)存在,之前的檢查操作如同幻影。Mysql默認(rèn)采用可重復(fù)讀級(jí)別,所以只可能出現(xiàn)幻讀的情況。

設(shè)置事務(wù)隔離級(jí)別

可以在my.ini文件中[mysqld]下配置transaction-isolation屬性,隔離性的四個(gè)值為:READ-UNCOMMITTED、READ-COMMITIED、REPEATABLE-READ、SERIALIZABLE,分別對(duì)應(yīng)讀未提交、讀已提交、可重復(fù)讀、串行讀四種隔離級(jí)別。

事務(wù)分類(lèi)

事務(wù)一般分為兩種:隱式事務(wù)和顯示事務(wù)。在Mysql中,事務(wù)默認(rèn)是自動(dòng)提交的,所以說(shuō)每個(gè)DML語(yǔ)句實(shí)際上就是一次事務(wù)的過(guò)程。 隱式事務(wù):沒(méi)有開(kāi)啟和結(jié)束的標(biāo)志,默認(rèn)執(zhí)行完SQL語(yǔ)句就自動(dòng)提交,比如我們經(jīng)常使用的INSERT、UPDATE、DELETE語(yǔ)句就屬于隱式事務(wù)。 顯示事務(wù):需要顯示的開(kāi)啟關(guān)閉,然后執(zhí)行一系列操作,最后如果全部操作都成功執(zhí)行,則提交事務(wù)釋放連接,如果操作有異常,則回滾事務(wù)中的所有操作。

事務(wù)使用步驟 開(kāi)啟事務(wù):關(guān)閉自動(dòng)提交,然后開(kāi)啟事務(wù)。 事務(wù)操作:一系列DML語(yǔ)句執(zhí)行。 事務(wù)結(jié)束:根據(jù)事務(wù)操作成功與否選擇提交事務(wù)或者回滾事務(wù)操作。

接下來(lái)我們簡(jiǎn)單的使用事務(wù)實(shí)現(xiàn)用戶(hù)A向用戶(hù)B轉(zhuǎn)賬的操作:

創(chuàng)建用戶(hù)表并插入兩條用戶(hù)數(shù)據(jù):

Mysql事務(wù)是什么意思

配置數(shù)據(jù)庫(kù)連接信息:

Mysql事務(wù)是什么意思

接下來(lái)從連接池中取出一個(gè)數(shù)據(jù)庫(kù)連接并進(jìn)行數(shù)據(jù)庫(kù)連接:

Mysql事務(wù)是什么意思

數(shù)據(jù)庫(kù)連接成功,則使用connection對(duì)象開(kāi)啟事務(wù): Mysql事務(wù)是什么意思

然后查詢(xún)轉(zhuǎn)賬賬號(hào)與待轉(zhuǎn)賬賬號(hào)是否存在,并進(jìn)行轉(zhuǎn)賬等一系列操作,這里由于魔鬼回調(diào)的原因我這里使用async庫(kù)變成鏈?zhǔn)秸{(diào)用:

Mysql事務(wù)是什么意思

最后根據(jù)事務(wù)操作的成功或失敗進(jìn)行事務(wù)提交或者事務(wù)回滾,并且釋放數(shù)據(jù)庫(kù)連接:

Mysql事務(wù)是什么意思

然后可以測(cè)試轉(zhuǎn)賬成功的情況可以發(fā)現(xiàn)轉(zhuǎn)賬操作成功了

Mysql事務(wù)是什么意思

再次測(cè)試轉(zhuǎn)賬失敗的操作可以發(fā)現(xiàn)扣除A積分和增加B積分的操作全部被回滾了,所以A和B的積分余額都沒(méi)有發(fā)生改變

Mysql事務(wù)是什么意思 

到此,相信大家對(duì)“Mysql事務(wù)是什么意思”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢(xún),關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI