MySQL事務(wù)

1. 事務(wù)的基本介紹

  1. 概念:
    如果一個(gè)包含多個(gè)步驟的業(yè)務(wù)操作,這些操作要么同時(shí)成功企垦,要么同時(shí)失敗涎永,否則就會(huì)出現(xiàn)數(shù)據(jù)錯(cuò)亂的情況。事務(wù)就是用來管理這些業(yè)務(wù)操作一死,保證能夠同時(shí)執(zhí)行成功或失敗肛度。

    1. 操作:
      1. 開啟事務(wù): start transaction;
      2. 回滾:rollback;
      3. 提交:commit;
      4.保存節(jié)點(diǎn):savepoint 節(jié)點(diǎn)名稱
      5.回滾節(jié)點(diǎn):rollback to 節(jié)點(diǎn)名稱

    2. 例子:

           CREATE TABLE account (
           id INT PRIMARY KEY AUTO_INCREMENT,
           NAME VARCHAR(10),
           balance DOUBLE
       );
       -- 添加數(shù)據(jù)
       INSERT INTO account (NAME, balance) VALUES ('zhangsan', 1000), ('lisi', 1000);
       
       
       SELECT * FROM account;
       UPDATE account SET balance = 1000;
       -- 張三給李四轉(zhuǎn)賬 500 元
       
       -- 0. 開啟事務(wù)
       START TRANSACTION;
       -- 1. 張三賬戶 -500
       
       UPDATE account SET balance = balance - 500 WHERE NAME = 'zhangsan';
       -- 2. 李四賬戶 +500
       -- 出錯(cuò)了...
       UPDATE account SET balance = balance + 500 WHERE NAME = 'lisi';
       
       -- 發(fā)現(xiàn)執(zhí)行沒有問題,提交事務(wù)
       COMMIT;
       
       -- 發(fā)現(xiàn)出問題了摘符,回滾事務(wù)
       ROLLBACK;
      
      1. MySQL數(shù)據(jù)庫中事務(wù)默認(rèn)自動(dòng)提交

        • 事務(wù)提交的兩種方式:
          • 自動(dòng)提交:
            • mysql就是自動(dòng)提交的
            • 一條DML(增刪改)語句會(huì)自動(dòng)提交一次事務(wù)贤斜。
          • 手動(dòng)提交:
            • Oracle 數(shù)據(jù)庫默認(rèn)是手動(dòng)提交事務(wù)
            • 需要先開啟事務(wù),再提交
        • 修改事務(wù)的默認(rèn)提交方式:
          • 查看事務(wù)的默認(rèn)提交方式:SELECT @@autocommit;
            -- 1 代表自動(dòng)提交 0 代表手動(dòng)提交
          • 修改默認(rèn)提交方式: set @@autocommit = 0;

2. 事務(wù)的四大特征:

    1. 原子性:是不可分割的最小操作單位逛裤,要么同時(shí)成功瘩绒,要么同時(shí)失敗。
    2. 持久性:當(dāng)事務(wù)提交或回滾后带族,數(shù)據(jù)庫會(huì)持久化的保存數(shù)據(jù)锁荔。
    3. 隔離性:多個(gè)事務(wù)之間。相互獨(dú)立蝙砌。
    4. 一致性:事務(wù)操作前后阳堕,數(shù)據(jù)總量不變

3. 事務(wù)的隔離級(jí)別

  • 概念:
    多個(gè)事務(wù)之間是隔離的,相互獨(dú)立的择克。但是如果多個(gè)事務(wù)操作同一批數(shù)據(jù)恬总,則會(huì)引發(fā)一些問題,設(shè)置不同的隔離級(jí)別就可以解決這些問題肚邢。

  • 存在問題:
    1. 臟讀:一個(gè)事務(wù)壹堰,讀取到另一個(gè)事務(wù)中沒有提交的數(shù)據(jù)
    2. 不可重復(fù)讀(虛讀):在同一個(gè)事務(wù)中拭卿,兩次讀取到的數(shù)據(jù)不一樣。
    3. 幻讀:同一個(gè)事務(wù)內(nèi)多次查詢返回的結(jié)果集不一樣贱纠。比如同一個(gè)事務(wù) A 第一次查詢時(shí)候有 n 條記錄峻厚,但是第二次同等條件下查詢卻有 n+1 條記錄,這就好像產(chǎn)生了幻覺谆焊。

  • 隔離級(jí)別:
    1. read uncommitted:讀未提交(最低隔離級(jí)別惠桃,事務(wù)未提交前,就可以被其他事務(wù)讀认绞浴)
    * 產(chǎn)生的問題:臟讀辜王、不可重復(fù)讀、幻讀
    2. read committed:讀已提交 (一個(gè)事務(wù)提交后才能被其他事務(wù)讀取到)
    * 產(chǎn)生的問題:不可重復(fù)讀剃执、幻讀
    3. repeatable read:可重復(fù)讀 (MySQL默認(rèn)級(jí)別誓禁,保證多次讀取一個(gè)數(shù)據(jù)時(shí),其值都和事務(wù)開始時(shí)的內(nèi)容一致肾档,禁止讀取到別的事務(wù)未提交的數(shù)據(jù))
    * 產(chǎn)生的問題:幻讀
    4. serializable:序列化(代價(jià)最高最可靠的隔離級(jí)別)
    * 可以解決所有的問題

    • 注意:隔離級(jí)別從小到大安全性越來越高摹恰,但是效率越來越低
      MySQL默認(rèn)事務(wù)隔離級(jí)別是repeatable read,一般情況下沒有特殊要求怒见,沒有必要修改俗慈。因?yàn)樵摷?jí)別可以滿足絕大部分項(xiàng)目需求。
  • 實(shí)際操作
    查詢當(dāng)前會(huì)話隔離級(jí)別:
    select @@tx_isolation;
    查詢系統(tǒng)當(dāng)前隔離級(jí)別:
    select @@global.tx_isolation;
    設(shè)置當(dāng)前會(huì)話隔離級(jí)別:
    set session transaction isolation level repeatable read(級(jí)別字符串);
    設(shè)置系統(tǒng)當(dāng)前隔離級(jí)別:
    set global transaction isolation level repeatable read;
    全局修改遣耍,修改MySQL. ini 配置文件在文件的最后添加:
    transaction-isolation = REPEATABLE-READ
    可用的配置值:READ-UNCOMMITTED闺阱、READ-COMMITTED、REPEATABLE-READ舵变、SERIALIZABLE酣溃。

        * 演示:
          set global transaction isolation level read uncommitted;
          start transaction;
          -- 轉(zhuǎn)賬操作
          update account set balance = balance - 500 where id = 1;
          update account set balance = balance + 500 where id = 2;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市纪隙,隨后出現(xiàn)的幾起案子赊豌,更是在濱河造成了極大的恐慌,老刑警劉巖绵咱,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碘饼,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡悲伶,警方通過查閱死者的電腦和手機(jī)艾恼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來麸锉,“玉大人钠绍,你說我怎么就攤上這事』ǔ粒” “怎么了柳爽?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵纳寂,是天一觀的道長。 經(jīng)常有香客問我泻拦,道長,這世上最難降的妖魔是什么忽媒? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任争拐,我火速辦了婚禮,結(jié)果婚禮上晦雨,老公的妹妹穿的比我還像新娘架曹。我一直安慰自己,他們只是感情好闹瞧,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布绑雄。 她就那樣靜靜地躺著,像睡著了一般奥邮。 火紅的嫁衣襯著肌膚如雪万牺。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天洽腺,我揣著相機(jī)與錄音脚粟,去河邊找鬼。 笑死蘸朋,一個(gè)胖子當(dāng)著我的面吹牛核无,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播藕坯,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼团南,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了炼彪?” 一聲冷哼從身側(cè)響起吐根,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎霹购,沒想到半個(gè)月后佑惠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡齐疙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年膜楷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贞奋。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡赌厅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出轿塔,到底是詐尸還是另有隱情特愿,我是刑警寧澤仲墨,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站揍障,受9級(jí)特大地震影響目养,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜毒嫡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一癌蚁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧兜畸,春花似錦努释、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至肛鹏,卻和暖如春逸邦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背在扰。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來泰國打工昭雌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人健田。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓烛卧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親妓局。 傳聞我的和親對(duì)象是個(gè)殘疾皇子总放,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

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