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鎖類型

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

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

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

排他鎖:又稱為寫鎖,簡(jiǎn)稱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ì)形成死鎖。

避免死鎖:

  • 類似的業(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)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

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

友情鏈接更多精彩內(nèi)容