本篇內(nèi)容主要講解“MySQL事務(wù)是什么意思”,感興趣的朋友不妨來(lái)看看。本文介紹的方法操作簡(jiǎn)單快捷,實(shí)用性強(qiáng)。下面就讓小編來(lái)帶大家學(xué)習(xí)“Mysql事務(wù)是什么意思”吧!
目前成都創(chuàng)新互聯(lián)已為超過(guò)千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、網(wǎng)站運(yùn)營(yíng)、企業(yè)網(wǎng)站設(shè)計(jì)、新寧網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
上一篇著重談到了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ù)中包含的處理要滿足數(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)用戶A向用戶B轉(zhuǎn)賬的操作:
創(chuàng)建用戶表并插入兩條用戶數(shù)據(jù):
配置數(shù)據(jù)庫(kù)連接信息:
接下來(lái)從連接池中取出一個(gè)數(shù)據(jù)庫(kù)連接并進(jìn)行數(shù)據(jù)庫(kù)連接:
數(shù)據(jù)庫(kù)連接成功,則使用connection對(duì)象開(kāi)啟事務(wù):
然后查詢轉(zhuǎn)賬賬號(hào)與待轉(zhuǎn)賬賬號(hào)是否存在,并進(jìn)行轉(zhuǎn)賬等一系列操作,這里由于魔鬼回調(diào)的原因我這里使用async庫(kù)變成鏈?zhǔn)秸{(diào)用:
最后根據(jù)事務(wù)操作的成功或失敗進(jìn)行事務(wù)提交或者事務(wù)回滾,并且釋放數(shù)據(jù)庫(kù)連接:
然后可以測(cè)試轉(zhuǎn)賬成功的情況可以發(fā)現(xiàn)轉(zhuǎn)賬操作成功了
再次測(cè)試轉(zhuǎn)賬失敗的操作可以發(fā)現(xiàn)扣除A積分和增加B積分的操作全部被回滾了,所以A和B的積分余額都沒(méi)有發(fā)生改變
到此,相信大家對(duì)“Mysql事務(wù)是什么意思”有了更深的了解,不妨來(lái)實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
文章題目:Mysql事務(wù)是什么意思
標(biāo)題鏈接:http://www.rwnh.cn/article14/igjjge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、品牌網(wǎng)站制作、定制網(wǎng)站、面包屑導(dǎo)航、做網(wǎng)站、用戶體驗(yàn)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)