MySQL學(xué)習(xí)日記(四)-事務(wù)

來源:轉(zhuǎn)載

MySQL的事務(wù)支持不是綁定在MySQL服務(wù)器本身,而是與存儲(chǔ)引擎相關(guān)1.MyISAM:不支持事務(wù)挨约,用于只讀程序提高性能 2.InnoDB:支持ACID事務(wù)、行級(jí)鎖、并發(fā) 3.Berkeley DB:支持事務(wù)


一個(gè)事務(wù)是一個(gè)連續(xù)的一組數(shù)據(jù)庫操作炭懊,就好像它是一個(gè)單一的工作單元進(jìn)行尉姨。換言之庵朝,永遠(yuǎn)不會(huì)是完整的事務(wù),除非該組內(nèi)的每個(gè)單獨(dú)的操作是成功的又厉。如果在事務(wù)的任何操作失敗九府,則整個(gè)事務(wù)將失敗。

實(shí)際上覆致,會(huì)俱樂部許多SQL查詢到一個(gè)組中侄旬,將執(zhí)行所有的人都一起作為事務(wù)的一部分。

事務(wù)的特性:

事務(wù)有以下四個(gè)標(biāo)準(zhǔn)屬性的縮寫ACID煌妈,通常被稱為:

原子性: 確保工作單元內(nèi)的所有操作都成功完成儡羔,否則事務(wù)將被中止在故障點(diǎn)宣羊,和以前的操作將回滾到以前的狀態(tài)。

一致性: 確保數(shù)據(jù)庫正確地改變狀態(tài)后汰蜘,成功提交的事務(wù)仇冯。

隔離性: 使事務(wù)操作彼此獨(dú)立的和透明的。

持久性: 確保提交的事務(wù)的結(jié)果或效果的系統(tǒng)出現(xiàn)故障的情況下仍然存在鉴扫。

在MySQL中赞枕,事務(wù)開始使用COMMIT或ROLLBACK語句開始工作和結(jié)束。開始和結(jié)束語句的SQL命令之間形成了大量的事務(wù)坪创。

COMMIT & ROLLBACK:

這兩個(gè)關(guān)鍵字提交和回滾主要用于MySQL的事務(wù)炕婶。

當(dāng)一個(gè)成功的事務(wù)完成后,發(fā)出COMMIT命令應(yīng)使所有參與表的更改才會(huì)生效莱预。

如果發(fā)生故障時(shí)柠掂,應(yīng)發(fā)出一個(gè)ROLLBACK命令返回的事務(wù)中引用的每一個(gè)表到以前的狀態(tài)。

可以控制的事務(wù)行為稱為AUTOCOMMIT設(shè)置會(huì)話變量依沮。如果AUTOCOMMIT設(shè)置為1(默認(rèn)值)涯贞,然后每一個(gè)SQL語句(在事務(wù)與否)被認(rèn)為是一個(gè)完整的事務(wù),并承諾在默認(rèn)情況下危喉,當(dāng)它完成宋渔。 AUTOCOMMIT設(shè)置為0時(shí),發(fā)出SET AUTOCOMMIT =0命令辜限,在隨后的一系列語句的作用就像一個(gè)事務(wù)皇拣,直到一個(gè)明確的COMMIT語句時(shí),沒有活動(dòng)的提交薄嫡。

可以通過使用mysql_query()函數(shù)在PHP中執(zhí)行這些SQL命令氧急。

事務(wù) ACID Atomicity(原子性)、Consistency(穩(wěn)定性)毫深、Isolation(隔離性)吩坝、Durability(可靠性)

1、事務(wù)的原子性

一組事務(wù)哑蔫,要么成功钉寝;要么撤回。

2闸迷、穩(wěn)定性

有非法數(shù)據(jù)(外鍵約束之類)嵌纲,事務(wù)撤回。

3稿黍、隔離性

事務(wù)獨(dú)立運(yùn)行。

一個(gè)事務(wù)處理后的結(jié)果崩哩,影響了其他事務(wù)巡球,那么其他事務(wù)會(huì)撤回言沐。

事務(wù)的100%隔離,需要犧牲速度酣栈。

4险胰、可靠性

軟、硬件崩潰后矿筝,InnoDB數(shù)據(jù)表驅(qū)動(dòng)會(huì)利用日志文件重構(gòu)修改起便。

可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit選項(xiàng) 決定什么時(shí)候吧事務(wù)保存到日志里窖维。

開啟事務(wù)

START TRANSACTION 或 BEGIN

提交事務(wù)(關(guān)閉事務(wù))

COMMIT

放棄事務(wù)(關(guān)閉事務(wù))

ROLLBACK

折返點(diǎn)

SAVEPOINT adqoo_1

ROLLBACK TO SAVEPOINT adqoo_1

發(fā)生在折返點(diǎn) adqoo_1 之前的事務(wù)被提交榆综,之后的被忽略

事務(wù)的終止

設(shè)置“自動(dòng)提交”模式

SET AUTOCOMMIT = 0

每條SQL都是同一個(gè)事務(wù)的不同命令,之間由 COMMIT 或 ROLLBACK隔開

掉線后铸史,沒有 COMMIT 的事務(wù)都被放棄

事務(wù)鎖定模式

系統(tǒng)默認(rèn): 不需要等待某事務(wù)結(jié)束鼻疮,可直接查詢到結(jié)果,但不能再進(jìn)行修改琳轿、刪除判沟。

缺點(diǎn):查詢到的結(jié)果,可能是已經(jīng)過期的崭篡。

優(yōu)點(diǎn):不需要等待某事務(wù)結(jié)束挪哄,可直接查詢到結(jié)果。

需要用以下模式來設(shè)定鎖定模式

1琉闪、SELECT …… LOCK IN SHARE MODE(共享鎖)

查詢到的數(shù)據(jù)迹炼,就是數(shù)據(jù)庫在這一時(shí)刻的數(shù)據(jù)(其他已commit事務(wù)的結(jié)果,已經(jīng)反應(yīng)到這里了)

SELECT 必須等待塘偎,某個(gè)事務(wù)結(jié)束后才能執(zhí)行

2疗涉、SELECT …… FOR UPDATE(排它鎖)

例如 SELECT * FROM tablename WHERE id<200

那么id<200的數(shù)據(jù),被查詢到的數(shù)據(jù)吟秩,都將不能再進(jìn)行修改咱扣、刪除、SELECT …… LOCK IN SHARE MODE操作

一直到此事務(wù)結(jié)束

共享鎖 和 排它鎖 的區(qū)別:在于是否阻斷其他客戶發(fā)出的 SELECT …… LOCK IN SHARE MODE命令

3涵防、INSERT / UPDATE / DELETE

所有關(guān)聯(lián)數(shù)據(jù)都會(huì)被鎖定闹伪,加上排它鎖

4、防插入鎖

例如 SELECT * FROM tablename WHERE id>200

那么id>200的記錄無法被插入

5壮池、死鎖

自動(dòng)識(shí)別死鎖

先進(jìn)來的進(jìn)程被執(zhí)行偏瓤,后來的進(jìn)程收到出錯(cuò)消息,并按ROLLBACK方式回滾

innodb_lock_wait_timeout = n 來設(shè)置最長等待時(shí)間椰憋,默認(rèn)是50秒

事務(wù)隔離模式

SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL

READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE

1厅克、不帶SESSION、GLOBAL的SET命令

只對(duì)下一個(gè)事務(wù)有效

2橙依、SET SESSION

為當(dāng)前會(huì)話設(shè)置隔離模式

3证舟、SET GLOBAL

為以后新建的所有MYSQL連接設(shè)置隔離模式(當(dāng)前連接不包括在內(nèi))

隔離模式

READ UNCOMMITTED

不隔離SELECT

其他事務(wù)未完成的修改(未COMMIT)硕旗,其結(jié)果也考慮在內(nèi)

READ COMMITTED

把其他事務(wù)的 COMMIT 修改考慮在內(nèi)

同一個(gè)事務(wù)中,同一 SELECT 可能返回不同結(jié)果

REPEATABLE READ(默認(rèn))

不把其他事務(wù)的修改考慮在內(nèi)女责,無論其他事務(wù)是否用COMMIT命令提交過

同一個(gè)事務(wù)中漆枚,同一 SELECT 返回同一結(jié)果(前提是本事務(wù),不修改)

SERIALIZABLE

和REPEATABLE READ類似抵知,給所有的SELECT都加上了 共享鎖

出錯(cuò)處理

根據(jù)出錯(cuò)信息墙基,執(zhí)行相應(yīng)的處理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市刷喜,隨后出現(xiàn)的幾起案子残制,更是在濱河造成了極大的恐慌,老刑警劉巖吱肌,帶你破解...
    沈念sama閱讀 219,490評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痘拆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡氮墨,警方通過查閱死者的電腦和手機(jī)纺蛆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來规揪,“玉大人桥氏,你說我怎么就攤上這事∶颓Γ” “怎么了字支?”我有些...
    開封第一講書人閱讀 165,830評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長奸忽。 經(jīng)常有香客問我堕伪,道長,這世上最難降的妖魔是什么栗菜? 我笑而不...
    開封第一講書人閱讀 58,957評(píng)論 1 295
  • 正文 為了忘掉前任欠雌,我火速辦了婚禮,結(jié)果婚禮上疙筹,老公的妹妹穿的比我還像新娘富俄。我一直安慰自己,他們只是感情好而咆,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評(píng)論 6 393
  • 文/花漫 我一把揭開白布霍比。 她就那樣靜靜地躺著,像睡著了一般暴备。 火紅的嫁衣襯著肌膚如雪悠瞬。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音浅妆,去河邊找鬼玛痊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛狂打,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播混弥,決...
    沈念sama閱讀 40,464評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼趴乡,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了蝗拿?” 一聲冷哼從身側(cè)響起晾捏,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哀托,沒想到半個(gè)月后惦辛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,847評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡仓手,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評(píng)論 3 338
  • 正文 我和宋清朗相戀三年胖齐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗽冒。...
    茶點(diǎn)故事閱讀 40,137評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡呀伙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出添坊,到底是詐尸還是另有隱情剿另,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評(píng)論 5 346
  • 正文 年R本政府宣布贬蛙,位于F島的核電站雨女,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏阳准。R本人自食惡果不足惜氛堕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望溺职。 院中可真熱鬧岔擂,春花似錦、人聲如沸浪耘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽七冲。三九已至痛倚,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間澜躺,已是汗流浹背蝉稳。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評(píng)論 1 272
  • 我被黑心中介騙來泰國打工抒蚜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人耘戚。 一個(gè)月前我還...
    沈念sama閱讀 48,409評(píng)論 3 373
  • 正文 我出身青樓嗡髓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親收津。 傳聞我的和親對(duì)象是個(gè)殘疾皇子饿这,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評(píng)論 2 355

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