mysql深入學(xué)習(xí)03

常用數(shù)據(jù)庫(kù)引擎特性比較.png

事務(wù)

定義:ACID(atomicity Consistency Isolation Durability)

mysql開(kāi)啟事務(wù)
begin / start transaction -- 手工
commit / rollback -- 事務(wù)提交或回滾
set session autocommit = on/off; -- 設(shè)定事務(wù)是否自動(dòng)開(kāi)啟

JDBC編程:connection.setAutoCommit(boolean);
Spring 事務(wù)AOP編程:expression=execution(com.gpedu.dao.*.*(..))

事務(wù)并發(fā)帶來(lái)的問(wèn)題

  • 臟讀(dirty read):如果第二個(gè)事務(wù)查詢到第一個(gè)事務(wù)還未提交的更新數(shù)據(jù),形成臟讀仲器。
    image.png
  • 虛讀(phantom read):一個(gè)事務(wù)執(zhí)行兩次查詢会通,第二次查詢比第一次多出或少一些數(shù)據(jù),造成兩次結(jié)果不一致娄周。只是另一個(gè)事務(wù)在這兩次查詢中間插入或者刪除了數(shù)據(jù)造成的。
    image.png
  • 不可重復(fù)讀(unrepeated read):一個(gè)事務(wù)兩次讀取同一行數(shù)據(jù)沪停,結(jié)果得到不同狀態(tài)結(jié)果煤辨,如中間正好另一個(gè)事務(wù)更新了該數(shù)據(jù),兩次結(jié)果相異木张,不可信任众辨。
    image.png

事務(wù)的四種隔離級(jí)別
[SQL92 ANSI/ISO標(biāo)準(zhǔn)]
(http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt)

隔離級(jí)別 解決問(wèn)題 原理
Read Uncommitted(未提交讀) 未解決并發(fā)問(wèn)題 事務(wù)未提交對(duì)其他事務(wù)也是可見(jiàn)的,臟讀(dirty read)
Read Committed(提交讀) 解決臟讀問(wèn)題 一個(gè)事務(wù)開(kāi)始之后舷礼,只能看到自己提交的事務(wù)所做的修改鹃彻,不可重復(fù)讀(nonrepeatable read)
Repeatable Read (可重復(fù)讀) 解決不可重復(fù)讀問(wèn)題 在同一個(gè)事務(wù)中多次讀取同樣的數(shù)據(jù)結(jié)果是一樣的,這種隔離級(jí)別未定義解決幻讀的問(wèn)題
Serializable(串行化) 解決所有問(wèn)題 最高的隔離級(jí)別妻献,通過(guò)強(qiáng)制事務(wù)的串行執(zhí)行
Innodb對(duì)事務(wù)的支持.png

隔離級(jí)別的實(shí)現(xiàn)是通過(guò)鎖和MVCC


鎖---用于管理不同事務(wù)對(duì)于共享資源的并發(fā)訪問(wèn)

鎖的比較方面:鎖定粒度蛛株、加鎖效率、沖突概率育拨、并發(fā)性能
Innodb支持行鎖谨履,可通過(guò)鎖定所有行間接實(shí)現(xiàn)表鎖。

Innodb鎖類(lèi)型

  • 共享鎖(行鎖):Shared Locks
  • 排它鎖(行鎖):Exclusive Locks
  • 意向鎖共享鎖(表鎖):Intention Shared Locks
  • 意向鎖排它鎖(表鎖):Intention Exclusive Locks
  • 自增鎖:AUTO-INC Locks
    行鎖的算法
  • 記錄鎖 Record locks
  • 間隙鎖 Gap locks
  • 臨鍵鎖 Next-key locks

共享鎖:又稱(chēng)為讀鎖熬丧,簡(jiǎn)稱(chēng)S鎖笋粟,顧名思義,共享鎖就是多個(gè)事務(wù)對(duì)于同一數(shù)據(jù)可以共享一把鎖析蝴,都能訪問(wèn)到數(shù)據(jù)害捕,但是只能讀不能修改;

//加鎖釋鎖方式:
select * from users WHERE id=1 LOCK IN SHARE MODE;
commit/rollback

排他鎖:又稱(chēng)為寫(xiě)鎖,簡(jiǎn)稱(chēng)X鎖闷畸,排他鎖不能與其他鎖并存尝盼,如一個(gè)事務(wù)獲取了一個(gè)數(shù)據(jù)行的排他鎖,其他事務(wù)就不能再獲取該行的鎖(共享鎖腾啥、排他鎖)东涡,只有該獲取了排他鎖的事務(wù)是可以對(duì)數(shù)據(jù)行進(jìn)行讀取和修改冯吓,(其他事務(wù)要讀取數(shù)據(jù)可來(lái)自于快照)

//加鎖釋鎖方式:
delete / update / insert 默認(rèn)加上X鎖
SELECT * FROM table_name WHERE ... FOR UPDATE
commit/rollback

Innodb行鎖是通過(guò)給索引項(xiàng)加鎖實(shí)現(xiàn)的,只有通過(guò)索引項(xiàng)進(jìn)行數(shù)據(jù)檢索才使用行鎖疮跑,否則使用表鎖
Innodb表鎖實(shí)現(xiàn) lock tables xx read/write组贺;

意向共享鎖(IS):表示事務(wù)準(zhǔn)備給數(shù)據(jù)行加入共享鎖,即一個(gè)數(shù)據(jù)行加共享鎖前必須先取得該表的IS鎖祖娘,意向共享鎖之間是可以相互兼容的
意向排它鎖(IX):表示事務(wù)準(zhǔn)備給數(shù)據(jù)行加入排他鎖失尖,即一個(gè)數(shù)據(jù)行加排他鎖前必須先取得該表的IX鎖,意向排它鎖之間是可以相互兼容的
意向鎖(IS渐苏、IX)是InnoDB數(shù)據(jù)操作之前自動(dòng)加的掀潮,不需要用戶干預(yù)
意義:當(dāng)事務(wù)想去進(jìn)行鎖表時(shí),可以先判斷意向鎖是否存在琼富,存在時(shí)則可快速返回該表不能啟用表鎖

自增鎖(auto_inc lock):自增列自增長(zhǎng)的表級(jí)鎖
show variables like 'innodb_autoinc_lock_mode';
默認(rèn)取值1仪吧,代表連續(xù),事務(wù)未提交ID永久丟失

Next-key locks(臨鍵鎖):鎖住記錄+區(qū)間(左開(kāi)右閉)Innodb行鎖的默認(rèn)算法
?當(dāng)sql執(zhí)行按照索引進(jìn)行數(shù)據(jù)的檢索時(shí),查詢條件為范圍查找(between and鞠眉、<薯鼠、>等)并有數(shù)據(jù)命中則此時(shí)SQL語(yǔ)句加上的鎖為Next-key locks,鎖住索引的記錄+區(qū)間(左開(kāi)右閉)
劃分區(qū)間的規(guī)則:根據(jù)存在的數(shù)據(jù)將表劃分為不同的區(qū)間械蹋,如下圖:

臨鍵鎖圖示.png

臨鍵鎖=間隙鎖+記錄鎖
Gap locks(間隙鎖):鎖住數(shù)據(jù)不存在的區(qū)間(左開(kāi)右開(kāi))
?當(dāng)sql執(zhí)行按照索引進(jìn)行數(shù)據(jù)的檢索時(shí)出皇,查詢條件的數(shù)據(jù)不存在,這時(shí)SQL語(yǔ)句加上的鎖即為Gap locks哗戈,鎖住索引不存在的區(qū)間(左開(kāi)右開(kāi))---查詢區(qū)間內(nèi)不存在郊艘,臨鍵鎖退化成間隙鎖
Record locks(記錄鎖):鎖住具體的索引項(xiàng)
?當(dāng)sql執(zhí)行按照唯一性(Primary key、Unique key)索引進(jìn)行數(shù)據(jù)的檢索時(shí)唯咬,查詢條件等值匹配且查詢的數(shù)據(jù)是存在纱注,這時(shí)SQL語(yǔ)句加上的鎖即為記錄鎖Record locks,鎖住具體的索引項(xiàng)

死鎖:多個(gè)事務(wù)相互持有鎖
案例:事務(wù)a先對(duì)表1進(jìn)行操作副渴,然后事務(wù)b對(duì)表2進(jìn)行操作奈附,兩個(gè)事務(wù)都沒(méi)有提交,隨后事務(wù)a表2進(jìn)行操作煮剧,事務(wù)b對(duì)表1進(jìn)行操作斥滤,就會(huì)形成死鎖。

避免死鎖:

  • 類(lèi)似的業(yè)務(wù)邏輯以固定的順序訪問(wèn)表和行勉盅。
  • 大事務(wù)拆小佑颇。大事務(wù)更傾向于死鎖,如果業(yè)務(wù)允許草娜,將大事務(wù)拆小挑胸。
  • 在同一個(gè)事務(wù)中,盡可能做到一次鎖定所需要的所有資源宰闰,減少死鎖概率茬贵。
  • 降低隔離級(jí)別簿透,如果業(yè)務(wù)允許,將隔離級(jí)別調(diào)低也是較好的選擇
  • 為表添加合理的索引解藻。不走索引將會(huì)為表的每一行記錄添加上鎖(或者說(shuō)是表鎖)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末老充,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子螟左,更是在濱河造成了極大的恐慌啡浊,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胶背,死亡現(xiàn)場(chǎng)離奇詭異巷嚣,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)钳吟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén)廷粒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人红且,你說(shuō)我怎么就攤上這事评雌。” “怎么了直焙?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)砂轻。 經(jīng)常有香客問(wèn)我奔誓,道長(zhǎng),這世上最難降的妖魔是什么搔涝? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任厨喂,我火速辦了婚禮,結(jié)果婚禮上庄呈,老公的妹妹穿的比我還像新娘蜕煌。我一直安慰自己,他們只是感情好诬留,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布斜纪。 她就那樣靜靜地躺著,像睡著了一般文兑。 火紅的嫁衣襯著肌膚如雪盒刚。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,772評(píng)論 1 290
  • 那天绿贞,我揣著相機(jī)與錄音因块,去河邊找鬼。 笑死籍铁,一個(gè)胖子當(dāng)著我的面吹牛涡上,可吹牛的內(nèi)容都是我干的趾断。 我是一名探鬼主播,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼吩愧,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼芋酌!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起耻警,我...
    開(kāi)封第一講書(shū)人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤隔嫡,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后甘穿,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體腮恩,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年温兼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了秸滴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡募判,死狀恐怖荡含,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情届垫,我是刑警寧澤释液,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布,位于F島的核電站装处,受9級(jí)特大地震影響误债,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜妄迁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一寝蹈、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧登淘,春花似錦箫老、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至流妻,卻和暖如春界斜,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背合冀。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工各薇, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓峭判,卻偏偏與公主長(zhǎng)得像开缎,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子林螃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

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

  • 一奕删、概述 數(shù)據(jù)庫(kù)鎖定機(jī)制簡(jiǎn)單來(lái)說(shuō),就是數(shù)據(jù)庫(kù)為了保證數(shù)據(jù)的一致性疗认,而使各種共享資源在被并發(fā)訪問(wèn)變得有序所設(shè)計(jì)的一種...
    忘憂谷主閱讀 589評(píng)論 0 3
  • 一完残、概述 數(shù)據(jù)庫(kù)鎖定機(jī)制簡(jiǎn)單來(lái)說(shuō),就是數(shù)據(jù)庫(kù)為了保證數(shù)據(jù)的一致性横漏,而使各種共享資源在被并發(fā)訪問(wèn)變得有序所設(shè)計(jì)的一種...
    不變甄心閱讀 2,732評(píng)論 0 3
  • 姓名:王成茗 日精進(jìn)打卡第67天 【打卡始于2017.10.12持續(xù)于2017.12.18】 【知~學(xué)習(xí)】...
    王成茗閱讀 135評(píng)論 0 0
  • 廣州又稱(chēng)“花城谨设、“羊城””一一一廣州白天景色很美,夜景也很美缎浇! 著名旅游景點(diǎn):黃埔軍校扎拣,荔灣廣場(chǎng),花城廣場(chǎng)素跺,廣州塔...
    連荷花閱讀 873評(píng)論 4 6
  • 芥子園畫(huà)傳山水篇P79
    焦璇閱讀 123評(píng)論 0 1