9 章 事務(wù)與鎖機(jī)制

show variables like 'autocommit'; 查詢是否開啟自動(dòng)提交
@@autocommit為on或1時(shí)表示開啟自動(dòng)提交。
set autocommit=0;可以顯示的關(guān)閉自動(dòng)提交。
使用MySQL命令 start transaction;可以隱式的關(guān)閉自動(dòng)提交。
commit;命令可以顯示的提交事務(wù)折晦。
savepoint 保存點(diǎn)名;
rollback to savepoint 保存點(diǎn)名;
release savepoint保存點(diǎn)名在抛;可以刪除一個(gè)事務(wù)保存點(diǎn)。
MySQL的鎖:鎖的粒度萧恕,隱式鎖刚梭,顯式鎖,鎖類型廊鸥,鎖的鑰匙望浩,生命周期。
鎖的粒度:服務(wù)器及鎖(server-level)和存儲(chǔ)引擎級(jí)鎖(storage-engine-level locking)
服務(wù)器級(jí)鎖以服務(wù)器為單位惰说,與表的存儲(chǔ)引擎無關(guān)磨德。
flush tables with read lock; 鎖定當(dāng)前MySQL服務(wù)實(shí)例,是服務(wù)器級(jí)讀鎖
MyISAM 只支持表級(jí)鎖
InnoDB 支持表級(jí)和行級(jí)鎖。
數(shù)據(jù)庫自動(dòng)為數(shù)據(jù)加鎖典挑,解鎖酥宴,這種鎖稱為隱式鎖。隱式鎖無需開發(fā)人員維護(hù)您觉。
讀鎖(read lock) 也叫共享鎖
寫鎖(write lock) 排他鎖或獨(dú)占鎖
鎖的鑰匙:
多個(gè)MySQL客戶機(jī)并發(fā)訪問一個(gè)數(shù)據(jù)拙寡,如果客戶機(jī)A對(duì)該數(shù)據(jù)成功加鎖,那么A擁有這把鎖的鑰匙琳水,也只有A能夠?qū)υ撴i進(jìn)行解鎖肆糕。

MyISAM引擎 select操作 會(huì)添加隱式讀說, insert,update,delete會(huì)隱式寫鎖在孝,
即MyISAM引擎都會(huì)隱式的添加表級(jí)鎖诚啃。
alter table account engin=MyISAM;
alter table book engin=MyISAM;
lock tables account read;
select * from accout;
select * from book;
unlock tables;
如果一個(gè)表需要同時(shí)添加讀鎖和寫鎖,那么需要為該表起兩個(gè)別名私沮,以區(qū)分讀鎖和寫鎖始赎。
read local 與read區(qū)別在于 read local是會(huì)話級(jí)別,后者是全局仔燕。

InnDB行級(jí)鎖:
1: 共享鎖 select * from 表 where 條件語句 lock in share mode;
2: 排它鎖 select * from 表 where 條件語句 for update;
insert, update , delete會(huì)隱式的添加排它鎖造垛。
延遲行級(jí)鎖的生命周期,可以通過添加事務(wù)來晰搀。
事務(wù)中的行級(jí)共享鎖和排它鎖的生命周期從加鎖開始五辽,直到事務(wù)提交或者回滾,行級(jí)鎖才會(huì)釋放厕隧。

意向鎖是隱式的表級(jí)鎖奔脐,數(shù)據(jù)庫開發(fā)人員在向InnoDB表的記錄添加行級(jí)鎖時(shí),InnoDB引擎會(huì)先自動(dòng)向該表添加意向鎖吁讨,然后在添加行級(jí)鎖髓迎。
意向鎖: 意向共享鎖(IS) 和 意向排它鎖 (IX)
說明:
意向鎖雖然是表級(jí)鎖,但是卻表示事務(wù)正在查詢或更新某一行記錄建丧,而不是整個(gè)表排龄,因此意向鎖之間不會(huì)產(chǎn)生沖突。
sql執(zhí)行完畢后翎朱,意向鎖會(huì)自動(dòng)解鎖橄维,因此意向共享鎖生命周期非常短暫,且不受為控制拴曲,意向排他鎖也是争舞。
InnoDB 表的行級(jí)鎖是通過對(duì)“索引”施加鎖的方式實(shí)現(xiàn)的,這就意味著澈灼,只有通過索引字段檢索數(shù)據(jù)的查詢語句或者更新語句竞川,才可能施加行級(jí)鎖店溢,否則InnoDB將使用表級(jí)鎖,而使用表級(jí)鎖勢(shì)必降低表的并發(fā)性能委乌。

show variables like 'innodb_lock_wait_timeout';
show full processlist; 查看當(dāng)MySQL實(shí)例運(yùn)行的線程信息
kill 線程id;
對(duì)于數(shù)據(jù)庫開發(fā)人員而言床牧,如果不了解InnoDB行級(jí)鎖是基于索引實(shí)現(xiàn)這一特性,可能會(huì)導(dǎo)致大量的鎖沖突遭贸,從而影響并發(fā)性能戈咳。

間隙鎖(next-key),間隙鎖也與索引密切相關(guān)。間隙鎖會(huì)鎖住沒加鎖的相鄰的數(shù)據(jù)
記錄鎖壕吹,僅僅為滿足查詢范圍記錄的施加鎖
Mysql的事務(wù)隔離級(jí)別為 repeatable read是 默認(rèn)使用時(shí)間隙鎖
隔離級(jí)別是 uncommitted或read committed 默認(rèn)是記錄鎖

默認(rèn)下著蛙,InnoDB存儲(chǔ)引擎一旦出現(xiàn)鎖等待超時(shí)異常,InnoDB存儲(chǔ)引擎既不會(huì)提交事務(wù)算利,也不會(huì)回滾事務(wù)册踩,而這是十分危險(xiǎn)的泳姐,一旦發(fā)生鎖等待超時(shí)效拭,應(yīng)用程序應(yīng)該自定義錯(cuò)誤處理程序,由開發(fā)人員選擇是進(jìn)一步提交事務(wù)還回滾事務(wù)胖秒。

默認(rèn)情況下InnoDB存儲(chǔ)引擎會(huì)自動(dòng)檢測(cè)死鎖缎患,通過比較參與死鎖問題的事務(wù)權(quán)重,從而選擇權(quán)重較小的事務(wù)進(jìn)行回滾阎肝,并釋放鎖挤渔,以便其他事物獲得鎖,繼續(xù)完成事務(wù)风题。每個(gè)事務(wù)的權(quán)重存儲(chǔ)在information_schema 數(shù)據(jù)庫INNODB_TRX表的trx_weight字段中判导。

事務(wù)的ACID特性
原子性
一致性
隔離性
持久性

事務(wù)的隔離級(jí)別:
Read uncommitted 讀 未提交數(shù)據(jù)
Read committed 讀已提交數(shù)據(jù)
Repeatable read 可重復(fù)讀
Serializable 串行化
臟讀:一個(gè)事務(wù)讀取到另一個(gè)事務(wù)未提交數(shù)據(jù)。
不可重復(fù)讀:同一個(gè)事務(wù)內(nèi)沛硅,兩條相同的查詢語句的查詢結(jié)果不一致眼刃。
幻讀:同一個(gè)事務(wù)內(nèi),兩條相同查詢語句的查詢結(jié)果本應(yīng)該相同摇肌。但是擂红,如果另一個(gè)事務(wù)同時(shí)提交了新數(shù)據(jù),當(dāng)本事務(wù)更新時(shí)围小,會(huì)“驚奇的”發(fā)現(xiàn)這些新數(shù)據(jù)昵骤,貌似之前讀到的數(shù)據(jù)是“鬼影”一樣的幻覺。

select @@session.tx_isolattion; 查詢MySQL服務(wù)實(shí)例的隔離級(jí)別
select @@global.tx_isolation; 查全局
設(shè)置隔離級(jí)別
set { global | session} transaction isolation level {
read uncommitted | read committed | repeatable read | serializable
}

說明:不可重復(fù)讀與臟讀的區(qū)別在于肯适,臟讀現(xiàn)象是讀取了其他事務(wù)未提交的數(shù)據(jù)变秦;而不可以重復(fù)讀現(xiàn)象讀到的是其他事務(wù)已提交的數(shù)據(jù)。

說明:幻讀現(xiàn)象與不可重復(fù)讀現(xiàn)象的不同之處在于框舔,幻讀現(xiàn)象讀不到其他事物已經(jīng)提交的數(shù)據(jù)蹦玫,而不可重復(fù)讀現(xiàn)象讀到的是其他事物已經(jīng)提交的數(shù)據(jù)。

避免幻讀的兩個(gè)方法:
1:保持事務(wù)的隔離級(jí)別是repeatable read不變,利用間隙鎖的特點(diǎn)钳垮,對(duì)查詢結(jié)果集施加共享鎖(lock in share mode) 或排它鎖 (for update )惑淳。這種方法要求數(shù)據(jù)庫開發(fā)人了解間隙鎖的特點(diǎn)
2:將事務(wù)的隔離級(jí)別設(shè)置為serializable,可以避免幻讀現(xiàn)象。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末饺窿,一起剝皮案震驚了整個(gè)濱河市歧焦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌肚医,老刑警劉巖绢馍,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異肠套,居然都是意外死亡舰涌,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門你稚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓷耙,“玉大人,你說我怎么就攤上這事刁赖「橥矗” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵宇弛,是天一觀的道長(zhǎng)鸡典。 經(jīng)常有香客問我,道長(zhǎng)枪芒,這世上最難降的妖魔是什么彻况? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮舅踪,結(jié)果婚禮上纽甘,老公的妹妹穿的比我還像新娘。我一直安慰自己硫朦,他們只是感情好贷腕,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著咬展,像睡著了一般泽裳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上破婆,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天涮总,我揣著相機(jī)與錄音,去河邊找鬼祷舀。 笑死瀑梗,一個(gè)胖子當(dāng)著我的面吹牛烹笔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播抛丽,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼谤职,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了亿鲜?” 一聲冷哼從身側(cè)響起允蜈,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蒿柳,沒想到半個(gè)月后饶套,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡垒探,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年妓蛮,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片圾叼。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蛤克,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出褐奥,到底是詐尸還是另有隱情咖耘,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布撬码,位于F島的核電站,受9級(jí)特大地震影響版保,放射性物質(zhì)發(fā)生泄漏呜笑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一彻犁、第九天 我趴在偏房一處隱蔽的房頂上張望叫胁。 院中可真熱鬧,春花似錦汞幢、人聲如沸驼鹅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽输钩。三九已至,卻和暖如春仲智,著一層夾襖步出監(jiān)牢的瞬間买乃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工钓辆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留剪验,地道東北人肴焊。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像功戚,于是被迫代替她去往敵國(guó)和親娶眷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

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