MySQL事務(wù)

一、事務(wù)的概念:

什么是"事務(wù)":它是數(shù)據(jù)庫中的概念关带。它是指一個具體的業(yè)務(wù),在數(shù)據(jù)庫中要多條語句才能完成研儒,例如:

銀行轉(zhuǎn)賬的業(yè)務(wù):張三給李四轉(zhuǎn)賬1000元豫缨;
    1).給張三賬戶減少1000元独令;
    2).給李四賬戶增加1000元;

這時我們程序至少要發(fā)送兩條SQL語句好芭,這樣中間就會有時間差燃箭,在這個時間差內(nèi)如果程序或者數(shù)據(jù)庫軟件發(fā)生問題,而一條SQL已經(jīng)被執(zhí)行舍败,再次重啟后招狸,由于只發(fā)生了一條修改,第二條沒有被執(zhí)行邻薯,這樣數(shù)據(jù)的整體就不準確了裙戏。

這就要求數(shù)據(jù)庫軟件必須具有一種能力:將多條SQL語句看成是一個整體,要么全部執(zhí)行成功厕诡;如果有一條失敗累榜,全部失敗,這種處理能力就叫:事務(wù)處理灵嫌。

二壹罚、獨立操作數(shù)據(jù)庫軟件來操作事務(wù):

1、查看當前數(shù)據(jù)庫的"事務(wù)處理"方式:
        show variables like 'autocommit';
            查詢結(jié)果:
            +---------------+-------+
            | Variable_name | Value |
            +---------------+-------+
            | autocommit    | ON    | 自動提交:開啟(關(guān)閉)
            +---------------+-------+

自動提交(開啟):每條SQL語句作為一個獨立的事務(wù)寿羞,多條SQL語句之間沒有任何關(guān)系猖凛。
每條SQL發(fā)送到服務(wù)器會被立即執(zhí)行。這種情況下绪穆,不能滿足我們的需要辨泳。

2、操作事務(wù)的兩種方式:

A).關(guān)閉自動提交:

1).關(guān)閉自動提交:
    set autocommit = off;
2).發(fā)送SQL語句
    update ....
    delete ....
    insert ....
    select ....
3).提交/回滾
    commit;//提交
    rollback;//回滾

注意:一旦提交玖院,會將這之前所有緩存的SQL語句全部執(zhí)行菠红,并且立即修改數(shù)據(jù)庫,到這里司恳,這個事務(wù)就算結(jié)束途乃,之后再發(fā)送的SQL語句就作為另一個事務(wù)。
一旦提交后扔傅,不能在回滾,一旦回滾后烫饼,也不能再提交了猎塞。

B).在"自動提交"狀態(tài)下,開啟一個"臨時事務(wù)"

1).開啟臨時事務(wù):
    start transaction;
2).發(fā)送SQL語句:
    update ...
    insert ...
    delete ...
    select ...
3).提交/回滾
    commit;//提交
    rollback;//回滾杠纵;

注意:一旦提交/回滾后荠耽,這個事務(wù)就整體結(jié)束,立即恢復(fù)到"自動提交"狀態(tài)(每條SQL語句都是一個獨立事務(wù))比藻。

三铝量、事務(wù)的特性ACID:

1倘屹、原子性(Atomicity)原子性是指事務(wù)是一個不可分割的工作單位,事務(wù)中的操作要么都發(fā)生慢叨,要么都不發(fā)生纽匙。
2、一致性(Consistency)事務(wù)前后數(shù)據(jù)的完整性必須保持一致拍谐。
3烛缔、隔離性(Isolation)事務(wù)的隔離性是指多個用戶并發(fā)訪問數(shù)據(jù)庫時,一個用戶的事務(wù)不能被其它用戶的事務(wù)所干擾轩拨,多個并發(fā)事務(wù)之間數(shù)據(jù)要相互隔離践瓷。
4、持久性(Durability)持久性是指一個事務(wù)一旦被提交亡蓉,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的晕翠,接下來即使數(shù)據(jù)庫發(fā)生故障也不應(yīng)該對其有任何影響。

四砍濒、事務(wù)的并發(fā)訪問問題(隔離性)

如果不考慮隔離性淋肾,事務(wù)存在3種并發(fā)訪問問題。

1梯影、臟讀:一個事務(wù)讀到了另一個事務(wù)未提交的數(shù)據(jù).
2巫员、不可重復(fù)讀:一個事務(wù)讀到了另一個事務(wù)已經(jīng)提交(update)的數(shù)據(jù)。引發(fā)另一個事務(wù)甲棍,在事務(wù)中的多次查詢結(jié)果不一致简识。
3、虛讀 /幻讀:一個事務(wù)讀到了另一個事務(wù)已經(jīng)提交(insert)的數(shù)據(jù)感猛。導(dǎo)致另一個事務(wù)七扰,在事務(wù)中多次查詢的結(jié)果不一致。

解決并發(fā)性問題—設(shè)置隔離級別:

1.read uncommitted 讀未提交:一個事務(wù)讀到另一個事務(wù)沒有提交的數(shù)據(jù)陪白。
?? a)存在:3個問題(臟讀颈走、不可重復(fù)讀、虛讀)咱士。
?? b)解決:0個問題
2.read committed 讀已提交:一個事務(wù)讀到另一個事務(wù)已經(jīng)提交的數(shù)據(jù)立由。
?? a)存在:2個問題(不可重復(fù)讀、虛讀)序厉。
?? b)解決:1個問題(臟讀)
3.repeatable read:可重復(fù)讀:在一個事務(wù)中讀到的數(shù)據(jù)始終保持一致锐膜,無論另一個事務(wù)是否提交。
?? a)存在:1個問題(虛讀)(MySQL中也同時解決了虛讀和幻讀)
?? b)解決:2個問題(臟讀弛房、不可重復(fù)讀)
4.serializable 串行化:同時只能執(zhí)行一個事務(wù)道盏,相當于事務(wù)中的單線程。
?? a)存在:0個問題。
?? b)解決:3個問題(臟讀荷逞、不可重復(fù)讀媒咳、虛讀)

1).查看當前的隔離級別:
    select @@tx_isolation;
2).設(shè)置隔離級別:
    set session transaction isolation level 上面的四個隔離級別之一;
3).安全和性能對比
    安全性:serializable > repeatable read > read committed > read uncommitted
    性能 : serializable < repeatable read < read committed < read uncommitted
4).常見數(shù)據(jù)庫的默認隔離級別:
    MySql:repeatable read
    Oracle:read committed

Spring中,默認的事務(wù)隔離級別是數(shù)據(jù)庫的默認級別种远,通常是READ COMMITTED涩澡。你可以使用@Transactional注解的isolation屬性來指定事務(wù)的隔離級別。

三院促、事務(wù)傳播行為(Transaction Propagation)

事務(wù)傳播行為用于控制一個事務(wù)方法如何與另一個事務(wù)方法交互筏养,即當一個事務(wù)方法調(diào)用另一個事務(wù)方法時,應(yīng)該如何處理事務(wù)的傳播常拓。Spring定義了七種不同的事務(wù)傳播行為:

1渐溶、REQUIRED(默認): 如果當前存在事務(wù),則加入該事務(wù)弄抬;如果當前沒有事務(wù)茎辐,則創(chuàng)建一個新的事務(wù)。這是最常用的傳播行為掂恕。

2拖陆、SUPPORTS: 如果當前存在事務(wù),則加入該事務(wù)懊亡;如果當前沒有事務(wù)依啰,則以非事務(wù)的方式執(zhí)行。

3店枣、MANDATORY: 必須在一個已有的事務(wù)中執(zhí)行速警,否則拋出異常。

4鸯两、REQUIRES_NEW: 創(chuàng)建一個新的事務(wù)闷旧,如果當前存在事務(wù),則將當前事務(wù)掛起钧唐。

5忙灼、NOT_SUPPORTED: 以非事務(wù)的方式執(zhí)行操作,如果當前存在事務(wù)钝侠,則將當前事務(wù)掛起该园。

6、NEVER: 以非事務(wù)的方式執(zhí)行帅韧,如果當前存在事務(wù)爬范,則拋出異常。

7弱匪、NESTED: 如果當前存在事務(wù),則在嵌套事務(wù)內(nèi)執(zhí)行。嵌套事務(wù)是外部事務(wù)的一部分萧诫,但是有自己的保存點斥难。它可以獨立地提交或回滾。

事務(wù)傳播行為(Transaction Propagation)隔離級別(Isolation Level)是事務(wù)管理中兩個重要的概念帘饶,它們分別用于控制事務(wù)的行為和數(shù)據(jù)的可見性哑诊。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市及刻,隨后出現(xiàn)的幾起案子镀裤,更是在濱河造成了極大的恐慌,老刑警劉巖缴饭,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件暑劝,死亡現(xiàn)場離奇詭異,居然都是意外死亡颗搂,警方通過查閱死者的電腦和手機担猛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丢氢,“玉大人傅联,你說我怎么就攤上這事【尾欤” “怎么了蒸走?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長貌嫡。 經(jīng)常有香客問我比驻,道長,這世上最難降的妖魔是什么衅枫? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任嫁艇,我火速辦了婚禮,結(jié)果婚禮上弦撩,老公的妹妹穿的比我還像新娘步咪。我一直安慰自己,他們只是感情好益楼,可當我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布猾漫。 她就那樣靜靜地躺著,像睡著了一般感凤。 火紅的嫁衣襯著肌膚如雪悯周。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天陪竿,我揣著相機與錄音禽翼,去河邊找鬼。 笑死,一個胖子當著我的面吹牛闰挡,可吹牛的內(nèi)容都是我干的锐墙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼长酗,長吁一口氣:“原來是場噩夢啊……” “哼溪北!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起夺脾,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤之拨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后咧叭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚀乔,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年佳簸,在試婚紗的時候發(fā)現(xiàn)自己被綠了乙墙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡生均,死狀恐怖听想,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情马胧,我是刑警寧澤汉买,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站佩脊,受9級特大地震影響蛙粘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜威彰,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一出牧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧歇盼,春花似錦舔痕、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至邢笙,卻和暖如春啸如,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背氮惯。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工叮雳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留想暗,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓债鸡,卻偏偏與公主長得像江滨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子厌均,可洞房花燭夜當晚...
    茶點故事閱讀 44,955評論 2 355

推薦閱讀更多精彩內(nèi)容