本篇內(nèi)容主要講解“MySQL事務(wù)是什么意思”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“Mysql事務(wù)是什么意思”吧!
目前成都創(chuàng)新互聯(lián)已為超過千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、網(wǎng)站運營、企業(yè)網(wǎng)站設(shè)計、新寧網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
上一篇著重談到了MySQL鎖的概念,里面談到了事務(wù)的概念,其實大部分開發(fā)者對于事務(wù)肯定不陌生,事務(wù)的概念其實就是一組SQL語句組成一個執(zhí)行單元,如果單元中的某個SQL語句執(zhí)行出現(xiàn)異常,則需要將整個事務(wù)進行回滾到未修改的狀態(tài)。只有單元中全部SQL語句都成功執(zhí)行,才會提交數(shù)據(jù)代表事務(wù)執(zhí)行成功。而Mysql其實前幾篇我們都已經(jīng)知道是支持多種存儲引擎的,其實正是因為MyISAM引擎不支持事務(wù)被InnoDB取代的原因。所以本篇文章主要是針對InnoDB引擎詳細了解下事務(wù)這個概念。
事務(wù)特性
原子性: 事務(wù)是一個原子操作單元,其對數(shù)據(jù)的修改,要么全都執(zhí)行,要么全都不執(zhí)行。
一致性:事務(wù)中包含的處理要滿足數(shù)據(jù)庫提前設(shè)置的約束,如主鍵約束或者NOT NULL 約束等。
隔離性:事務(wù)處理過程中的中間狀態(tài)對外部是不可見的。
持久性:事務(wù)完成之后,它對于數(shù)據(jù)的修改是永久性的。
隔離性的四種隔離級別
InnoDB引擎支持的4種事務(wù)隔離級別分別是:讀未提交、讀已提交、可重復(fù)讀、串行讀。
讀未提交:允許臟讀,可以讀取其他session中未提交的臟數(shù)據(jù)。
讀已提交:不可讀取其他session尚未提交的數(shù)據(jù),只有其他session數(shù)據(jù)已提交才能讀取到,為不重復(fù)讀。
可重復(fù)讀:該級別下可重復(fù)讀,InnoDB引擎默認采用可重復(fù)讀,不允許讀取還未提交的臟數(shù)據(jù),但是可能存在InnoDB獨有的幻讀。
串行讀:該級別下隔離程度最高,事務(wù)只能一個接著一個串行執(zhí)行,無法并發(fā)執(zhí)行。每次串行讀都需要獲得表級共享鎖,讀寫操作都會阻塞。
幻讀
事務(wù)在插入一條已經(jīng)經(jīng)過檢查不存在的記錄,但是插入結(jié)果是數(shù)據(jù)已經(jīng)存在,之前的檢查操作如同幻影。Mysql默認采用可重復(fù)讀級別,所以只可能出現(xiàn)幻讀的情況。
設(shè)置事務(wù)隔離級別
可以在my.ini文件中[mysqld]下配置transaction-isolation屬性,隔離性的四個值為:READ-UNCOMMITTED、READ-COMMITIED、REPEATABLE-READ、SERIALIZABLE,分別對應(yīng)讀未提交、讀已提交、可重復(fù)讀、串行讀四種隔離級別。
事務(wù)分類
事務(wù)一般分為兩種:隱式事務(wù)和顯示事務(wù)。在Mysql中,事務(wù)默認是自動提交的,所以說每個DML語句實際上就是一次事務(wù)的過程。 隱式事務(wù):沒有開啟和結(jié)束的標志,默認執(zhí)行完SQL語句就自動提交,比如我們經(jīng)常使用的INSERT、UPDATE、DELETE語句就屬于隱式事務(wù)。 顯示事務(wù):需要顯示的開啟關(guān)閉,然后執(zhí)行一系列操作,最后如果全部操作都成功執(zhí)行,則提交事務(wù)釋放連接,如果操作有異常,則回滾事務(wù)中的所有操作。
事務(wù)使用步驟開啟事務(wù):關(guān)閉自動提交,然后開啟事務(wù)。 事務(wù)操作:一系列DML語句執(zhí)行。 事務(wù)結(jié)束:根據(jù)事務(wù)操作成功與否選擇提交事務(wù)或者回滾事務(wù)操作。
接下來我們簡單的使用事務(wù)實現(xiàn)用戶A向用戶B轉(zhuǎn)賬的操作:
創(chuàng)建用戶表并插入兩條用戶數(shù)據(jù):
配置數(shù)據(jù)庫連接信息:
接下來從連接池中取出一個數(shù)據(jù)庫連接并進行數(shù)據(jù)庫連接:
數(shù)據(jù)庫連接成功,則使用connection對象開啟事務(wù):
然后查詢轉(zhuǎn)賬賬號與待轉(zhuǎn)賬賬號是否存在,并進行轉(zhuǎn)賬等一系列操作,這里由于魔鬼回調(diào)的原因我這里使用async庫變成鏈式調(diào)用:
最后根據(jù)事務(wù)操作的成功或失敗進行事務(wù)提交或者事務(wù)回滾,并且釋放數(shù)據(jù)庫連接:
然后可以測試轉(zhuǎn)賬成功的情況可以發(fā)現(xiàn)轉(zhuǎn)賬操作成功了
再次測試轉(zhuǎn)賬失敗的操作可以發(fā)現(xiàn)扣除A積分和增加B積分的操作全部被回滾了,所以A和B的積分余額都沒有發(fā)生改變
到此,相信大家對“Mysql事務(wù)是什么意思”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!