MySql--事務(wù)

事務(wù)

一、概述

1.什么是事務(wù)

事務(wù)指邏輯上的一組操作,組成這組操作的各個單元,要么全部成功,要么全部不成功。

  • 一個最小的不可再分的工作單元
  • 通常一個事務(wù)對應(yīng)了一個完整的業(yè)務(wù)
  • 而一個完整的業(yè)務(wù)需要批量的DML語句共同聯(lián)合完成
  • 事務(wù)只和DML語句有關(guān)系,或者說DML語句才有事務(wù)

例如:A——B轉(zhuǎn)帳,對應(yīng)于如下兩條sql語句

update account set money=money-100 where name=‘a(chǎn)’;
update account set money=money+100 where name=‘b’;

以上的兩條DML語句要求必須同時成功或者同時失敗,最小單元,不可再分。當(dāng)?shù)谝粭lDML語句執(zhí)行成功之后,并不能將底層數(shù)據(jù)庫中第一個賬戶的數(shù)據(jù)修改,只是將操作記錄了,這個記錄是在內(nèi)存中完成的,當(dāng)?shù)诙lDML語句執(zhí)行成功之后,和底層數(shù)據(jù)庫文件中的數(shù)據(jù)完成同步。若第二條DML語句執(zhí)行失敗,清空所有的歷史操作記錄。要完成以上的功能,必須借助事務(wù)。

2.事務(wù)的四個特征(ACID)

  • 原子性(Atomicity):
    原子性是指事務(wù)是一個不可分割的工作單位,事務(wù)中的操作要么都發(fā)生,要么都不發(fā)生。
  • 一致性(Consistency):事務(wù)必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另外一個一致性狀態(tài)。
  • 隔離性(Isolation):事務(wù)的隔離性是多個用戶并發(fā)訪問數(shù)據(jù)庫時,數(shù)據(jù)庫為每一個用戶開啟的事務(wù),不能被其他事務(wù)的操作數(shù)據(jù)所干擾,多個并發(fā)事務(wù)之間要相互隔離。
  • 持久性(Durability):持久性是指一個事務(wù)一旦被提交,它對數(shù)據(jù)庫中數(shù)據(jù)的改變就是永久性的,接下來即使數(shù)據(jù)庫發(fā)生故障也不應(yīng)該對其有任何影響。

3.關(guān)于一些術(shù)語:

  • 開啟事務(wù):start transaction
  • 結(jié)束事務(wù):end transaction
  • 提交事務(wù):commit transaction
  • 回滾事務(wù):rollback transaction

二、事務(wù)的提交與回滾

和事務(wù)有關(guān)的兩條SQL語句(TCL):

commit;  提交
rollback;  回滾

事務(wù)開啟的標(biāo)志:

任何一條DML語句(insert,update,delete)執(zhí)行,標(biāo)志事務(wù)的開啟

事務(wù)結(jié)束的標(biāo)志:

提交或回滾
提交:成功的結(jié)束,將所有的DML語句操作歷史記錄和底層硬盤文件中的數(shù)據(jù)來一次同步。
回滾:失敗的時候,將所有的DML語句操作歷史全部清空

注意:在事務(wù)進(jìn)行過程中,未結(jié)束之前,DML語句不會更改底層數(shù)據(jù)庫文件中的數(shù)據(jù),只是將歷史操作記錄下來,在內(nèi)存中完成記錄。只有在事務(wù)結(jié)束的時候,而且是成功的結(jié)束的時候才會修改底層硬盤文件中的數(shù)據(jù)。

三、自動提交模式

演示提交與回滾:

在mysql數(shù)據(jù)庫管理系統(tǒng)中,默認(rèn)情況下,事務(wù)是自動提交的
即,執(zhí)行一條DML語句,開啟事務(wù),并提交事務(wù)。

自動提交機(jī)制可以關(guān)閉:

方式一:
start transaction;  //手動開啟事務(wù)
DML語句...
commit;   //手動提交事務(wù)(事務(wù)成功地結(jié)束)

start transaction;  //手動開啟事務(wù)
DML語句...
rollback;   //手動回滾事務(wù)(事務(wù)失敗地結(jié)束)

方式二:
關(guān)閉自動提交:
set autocommit=off;
或:set session autocommit=off;
打開自動提交
set autocommit=on;
或:set session autocommit=on;
以上打開和關(guān)閉自動提交機(jī)制,只對當(dāng)前會話有效

四、事務(wù)的隔離級別

多個線程開啟各自事務(wù)操作數(shù)據(jù)庫中數(shù)據(jù)時,數(shù)據(jù)庫系統(tǒng)要負(fù)責(zé)隔離操作,以保證各個線程在獲取數(shù)據(jù)時的準(zhǔn)確性。
如果不考慮隔離性,可能會引發(fā)如下問題:

1.臟讀:指一個事務(wù)讀取了另外一個事務(wù)未提交的數(shù)據(jù)。這是非常危險的

假設(shè)A向B轉(zhuǎn)帳100元,對應(yīng)sql語句如下所示:

1.update account set money=money-100 while name=‘a(chǎn)’;
2.update account set money=money+100 while name=‘b’;

當(dāng)?shù)?條執(zhí)行完,第2條還沒執(zhí)行(A未提交時),
如果此時B查詢自己的帳戶,就會發(fā)現(xiàn)自己多了100元錢。
如果A等B走后再回滾,B就會損失100元。

2.不可重復(fù)讀(針對一條記錄的,同一條記錄前后不一樣)

在一個事務(wù)內(nèi)讀取表中的某一行數(shù)據(jù),多次讀取結(jié)果不同。
例如銀行想查詢A帳戶余額,第一次查詢A帳戶為200元,此時A向帳戶內(nèi)存了100元并提交了,銀行接著又進(jìn)行了一次查詢,此時A帳戶為300元了。銀行兩次查詢不一致,可能就會很困惑,不知道哪次查詢是準(zhǔn)的。

和臟讀的區(qū)別是,臟讀是讀取前一事務(wù)未提交的臟數(shù)據(jù),不可重復(fù)讀是重新讀取了前一事務(wù)已提交的數(shù)據(jù)。

很多人認(rèn)為這種情況就對了,無須困惑,當(dāng)然是后面的為準(zhǔn)。我們可以考慮這樣一種情況,比如銀行程序需要將查詢結(jié)果分別輸出到電腦屏幕和寫到文件中,結(jié)果在一個事務(wù)中針對輸出的目的地,進(jìn)行的兩次查詢不一致,導(dǎo)致文件和屏幕中的結(jié)果不一致,銀行工作人員就不知道以哪個為準(zhǔn)了。

3.虛讀(幻讀,同一張表前后不一樣記錄數(shù))

是指在一個事務(wù)內(nèi)讀取到了別的事務(wù)插入的數(shù)據(jù),導(dǎo)致前后讀取不一致。
如丙存款100元未提交,這時銀行做報表統(tǒng)計account表中所有用戶的總額為500元,然后丙提交了,這時銀行再統(tǒng)計發(fā)現(xiàn)帳戶為600元了,造成虛讀同樣會使銀行不知所措,到底以哪個為準(zhǔn)。

數(shù)據(jù)庫共定義了四種隔離級別:

Serializable(串行化):可避免臟讀、不可重復(fù)讀、虛讀情況的發(fā)生。
Repeatable read(可重復(fù)讀):可避免臟讀、不可重復(fù)讀情況的發(fā)生。
Read committed(讀已提交):可避免臟讀情況發(fā)生。
Read uncommitted(讀未提交):最低級別,以上情況均無法保證。
  • mysql數(shù)據(jù)庫管理系統(tǒng)默認(rèn)的隔離級別:repeatable read
  • oracle數(shù)據(jù)庫管理系統(tǒng)默認(rèn)的隔離級別:read committed

隔離級別的設(shè)置

1.通過修改配置文件設(shè)置

在my.ini文件中使用transaction-isolation選項來設(shè)置服務(wù)器的缺省隔離界別,該選項值可以是:

  • READ-UNCOMMITTED
  • READ-COMMITTED
  • REPEATABLE-READ
  • SERILIZABLE

例:

[mysqld]
transaction-isolation=READ-COMMITTED

2.通過命令動態(tài)設(shè)置

命令格式:

set [無/session/global] transaction isolation level <isolation-level>;

<isolation-level>可以是:

  • READ-UNCOMMITTED
  • READ-COMMITTED
  • REPEATABLE-READ
  • SERILIZABLE

隔離級別的作用范圍分兩種:

  • 全局級:對所有的會話有效(global)
  • 會話級:只對當(dāng)前的會話有效(session或不寫)

查看隔離級別:

查看當(dāng)前會話的隔離級別
select @@tx_isolation; 
select @@session.tx_isolation;

查看全局的事務(wù)隔離級別
select @@global.tx_isolation;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,238評論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,430評論 3 415
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,134評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,893評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,653評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,136評論 1 323
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,212評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,372評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,888評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,738評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,939評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,482評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,179評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,588評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,829評論 1 283
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,610評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 47,916評論 2 372

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