0001-MySQL中的事務

什么是事務逮壁?

事務就是一組應該一起成功或一起失敗的SQL語句。事務應該具備原子性粮宛、一致性窥淆、隔離性持久性ACID)的屬性。

  • 原子性:所有的SQL語句要么全部成功巍杈,要么全部失敗忧饭,不會存在部分更新。
  • 一致性:事務只能以允許的方式改變受其影響的數(shù)據(jù)筷畦。
  • 隔離性:同時發(fā)生的事務(并發(fā)事務)不應該導致數(shù)據(jù)庫處于不一致的狀態(tài)中词裤。系統(tǒng)中的每個事務都應該像唯一事務一樣執(zhí)行。任何事務都不應該影響其他事務的存在鳖宾。
  • 持久性:無論數(shù)據(jù)庫或系統(tǒng)是否發(fā)生故障吼砂,數(shù)據(jù)都會永久保存在磁盤上,并且不會丟失鼎文。

注意:InnoDB支持事務處理渔肩,而MyISAM不支持事務處理。

如何啟動一個事務(一組SQL)拇惋?

通過執(zhí)行START TRANSACTION或BEGIN語句:

mysql> START TRANSACTION;

mysql> BEGIN;

接著周偎,執(zhí)行你希望在事務中包含的所有語句抹剩。確保所有語句執(zhí)行成功后,執(zhí)行COMMIT語句蓉坎,該語句將完成事務并提交數(shù)據(jù):

mysql> COMMIT;

如果遇到錯誤并希望中止事務吧兔,可以發(fā)送ROLLBACK語句而非COMMIT語句:

mysql> ROLLBACK;

autocommit

默認情況下,autocommit的狀態(tài)時ON袍嬉,這意味著所有單獨的語句一旦被執(zhí)行就會被提交,除非該語句在BEGIN……COMMIT塊中灶平。如果autocommit的狀態(tài)為OFF伺通,則需要明確發(fā)出COMMIT語句來提交事務。要禁用autocommit逢享,請執(zhí)行:

mysql> SET autocommit=0;

DDL語句罐监,如數(shù)據(jù)庫的CREATE或DROP語句,以及表或存儲例程的CREATE瞒爬,DROP或ALERT語句弓柱,都是無法回滾的。

部分語句侧但,包括DDL語句矢空、LOAD DATA INFILE、ANALYZE TABLE以及與replication相關的語句禀横,會導致隱式COMMIT屁药。

保存點

使用保存點可以回滾到事務中的某些點,而且無須中止事務柏锄∧鸺可以使用SAVEPOINT標識符為事務設置名稱,并使用ROLLBACK TO標識語句將事務回滾到指定的保存點而不中止事務趾娃。

mysql> BEGIN;
...
mysql> SAVEPOINT transfer_to_b;
...
mysql> ROLLBACK TO transfer_to_b;
...
mysql> COMMIT;

隔離級別

當兩個或多個事務同時發(fā)生時缭嫡,隔離級別定義了一個事務與其他事務在資源或者數(shù)據(jù)修改方面的隔離級別。有四種類型的隔離級別抬闷,要更改隔離級別妇蛀,需要設置tx_isolation變量,該變量是動態(tài)的并具有會話級別的作用范圍饶氏。

如何修改

mysql> SET @@ transaction_isolation='READ-COMMITTED';

四種類型

  • 讀未提交
    當前事務可以讀取由另一個未提交的事務寫入的數(shù)據(jù)讥耗,這也稱為臟讀。臟讀是不安全的疹启。
  • 讀提交
    當前事務只能讀取另一個事務提交的數(shù)據(jù)古程,這也稱為不可重復讀取
  • 可重復讀
    一個事務通過第一條語句只能看到相同的數(shù)據(jù)喊崖,即使另一個事務已提交數(shù)據(jù)挣磨。在同一個事務中雇逞,讀取通過第一次讀取建立快照是一致的。一個例外是茁裙,一個事務可以讀取在同一事務中更改的數(shù)據(jù)塘砸。即幻讀
  • 序列化
    通過把選定的所有行鎖起來晤锥,序列化可以提供最高級別的隔離掉蔬。此級別與REPEATABLE READ類似,但如果禁用autocommit矾瘾,則InnoDB會將所有普通SELECT語句隱式轉換為SELECT ... LOCK IN SHARE MODE女轿;如果啟用autocommit,則SELECT就是它自己的事務壕翩。所以蛉迹,序列化會等待被鎖的行,并且總是讀取最新提交的數(shù)據(jù)放妈。

可重復度需要重點了解一下北救。這種可重復讀僅僅適用于SELECT語句,如果插入或修改某些行并提交該事務芜抒,那么從另一個并發(fā)REPEATABLE READ事務發(fā)出的DELETE或UPDATE語句珍策,可能會影響那些剛剛提交的行,即使會話無法查詢這些語句挽绩。如果事務更新或刪除由不同事務提交的行膛壹,則這些更改對當前事務變?yōu)榭梢姟?/p>

兩種鎖

  • 內部鎖:MySQL在自身服務器內部執(zhí)行內部鎖,以管理多個會話對表內容的爭用唉堪。
  • 外部鎖:MySQL為客戶會話提供選項來顯式地獲取表鎖模聋,以阻止其他會話訪問表。

其中唠亚,內部鎖可以分為行級鎖與表級鎖链方,外部鎖包括了READ與WRITE。

  • 行級鎖:行級鎖是細粒度的灶搜。只有被訪問的行會被鎖定祟蚀。這允許通過多個會話同時進行寫訪問,使其適用于多用戶割卖、高度并發(fā)和OLTP的應用程序前酿。只有InnoDB支持行級鎖。

  • 表級鎖:MySQL對MyISAM鹏溯、MEMORY和MERGE表使用表級鎖罢维,一次只允許一個會話更新這些表。這種鎖定級別使得這些存儲引擎更適用于只讀的或以讀取操作為主的或單用戶的應用程序丙挽。

  • 共享鎖(READ):當一個表被鎖定為READ時肺孵,多個會話可以從表中讀取數(shù)據(jù)而不需要獲取鎖匀借。此外,多個會話可以在同一個表上獲得鎖平窘。當READ鎖被保持時吓肋,沒有會話可以將數(shù)據(jù)寫入表中。如果有任何寫入嘗試瑰艘,該操作將處于等待狀態(tài)是鬼,直到READ鎖被釋放。

  • 排他鎖(WRITE):當一個表被鎖定為WRITE時紫新,除持有該鎖的會話之外屑咳,其他任何會話都不能讀取或向表中寫入數(shù)據(jù)。除非現(xiàn)有鎖被釋放弊琴,否則其他任何會話都不能獲得任何鎖。如果有任何讀取/寫入嘗試杖爽,該操作將處于等待狀態(tài)敲董,直到WRITE鎖被釋放。

當會話中止慰安,或執(zhí)行UNLOCK TABLES時腋寨,所有鎖都會被釋放

如何使用

鎖定表的語法

mysql> LOCK TABLES table_name [READ | WRITE]

要解鎖表

mysql> UNLOCK TABLES;

要鎖定所有數(shù)據(jù)庫中的所有表,請執(zhí)行以下語句化焕。在獲取數(shù)據(jù)庫的一致快照時需要使用該語句萄窜,它會凍結對數(shù)據(jù)庫的所有寫入操作:

mysql> FLUSH TABLES WITH READ LOCK;

鎖隊列

除共享鎖之外,沒有兩個鎖可以一起加在一個表上撒桨。如果一個表已經(jīng)有一個共享鎖查刻,此時有一個排他鎖要進來,那么它將被保留在隊列中凤类,直到共享鎖被釋放穗泵。當排他鎖在隊列中時,所有后續(xù)的共享鎖也會被阻塞并保留在隊列中谜疤。

當InnoDB從表中讀取/寫入數(shù)據(jù)時會獲取元數(shù)據(jù)鎖佃延。如果第二個事務請求WRITE LOCK,該事務將被保留在隊列中夷磕,直到第一個事務完成履肃。如果第三個事務想要讀取數(shù)據(jù),就必須等到第二個事務完成坐桩。

One More Thing

  • 事務的隔離級別越高尺棋,越能保證數(shù)據(jù)的完整性和一致性,但是對并發(fā)性能的影響也越大撕攒。

2018-01-23

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末陡鹃,一起剝皮案震驚了整個濱河市烘浦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萍鲸,老刑警劉巖闷叉,帶你破解...
    沈念sama閱讀 221,576評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異脊阴,居然都是意外死亡握侧,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評論 3 399
  • 文/潘曉璐 我一進店門嘿期,熙熙樓的掌柜王于貴愁眉苦臉地迎上來品擎,“玉大人,你說我怎么就攤上這事备徐√汛” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評論 0 360
  • 文/不壞的土叔 我叫張陵蜜猾,是天一觀的道長秀菱。 經(jīng)常有香客問我,道長蹭睡,這世上最難降的妖魔是什么衍菱? 我笑而不...
    開封第一講書人閱讀 59,626評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮肩豁,結果婚禮上脊串,老公的妹妹穿的比我還像新娘。我一直安慰自己清钥,他們只是感情好琼锋,可當我...
    茶點故事閱讀 68,625評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著祟昭,像睡著了一般斩例。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上从橘,一...
    開封第一講書人閱讀 52,255評論 1 308
  • 那天念赶,我揣著相機與錄音,去河邊找鬼恰力。 笑死叉谜,一個胖子當著我的面吹牛,可吹牛的內容都是我干的踩萎。 我是一名探鬼主播停局,決...
    沈念sama閱讀 40,825評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了董栽?” 一聲冷哼從身側響起码倦,我...
    開封第一講書人閱讀 39,729評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锭碳,沒想到半個月后袁稽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡擒抛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,363評論 3 340
  • 正文 我和宋清朗相戀三年推汽,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歧沪。...
    茶點故事閱讀 40,498評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡歹撒,死狀恐怖,靈堂內的尸體忽然破棺而出诊胞,到底是詐尸還是另有隱情暖夭,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評論 5 350
  • 正文 年R本政府宣布撵孤,位于F島的核電站鳞尔,受9級特大地震影響,放射性物質發(fā)生泄漏早直。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,867評論 3 333
  • 文/蒙蒙 一市框、第九天 我趴在偏房一處隱蔽的房頂上張望霞扬。 院中可真熱鬧,春花似錦枫振、人聲如沸喻圃。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斧拍。三九已至,卻和暖如春杖小,著一層夾襖步出監(jiān)牢的瞬間肆汹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評論 1 272
  • 我被黑心中介騙來泰國打工予权, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留昂勉,地道東北人。 一個月前我還...
    沈念sama閱讀 48,906評論 3 376
  • 正文 我出身青樓扫腺,卻偏偏與公主長得像岗照,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,507評論 2 359

推薦閱讀更多精彩內容