MySQL事務
事務存在的原因
事務存在的目的:保證用戶對資料操作對資料是安全的,(比如說銀行卡余額)
事務的特性——ACID
原子性:一個事務要么全部執行,要么不執行
一致性:事務開始和結束時,資料保持一致
隔離性:事務之間互不影響
持久性:事務操作的結果具有持久性
關于臟讀,不可重復讀,幻讀
-
臟讀
事務A讀取了事務B中尚未提交的資料,如果事務B回滾,則A讀取使用了錯誤的資料,
【一個事物在讀的時候,禁止讀取未提交的事務】
-
不可重復讀
不可重復讀是指在一個事務范圍內多次查詢卻回傳了不同的資料值,這是由于存在查詢間隔,被另一個事務修改并提交了,
【一個事物在讀的時候,禁止任何事務寫】
-
幻讀
在事務A多次讀取程序中,事務B對資料進行了新增操作,導致事務A多次讀取的資料不一致,
【一個事物加上表級鎖,禁止任何操作的并發】
小結:
臟讀是讀取了尚未提交的資料,不可重復讀是讀取了不停更新的資料(修改),幻讀是指讀取了不停更新的資料(新增),
關于事務隔離級別
目的:避免臟讀,不可重復讀,幻讀
讀未提交:一個事務可以讀到另一個事務尚未提交的資料,也就是臟讀,避免臟讀的方式:
讀提交:一個事務要等另一個事務提交后才能讀取資料,但會導致一個事務中相同查詢出現不同的結果,也就是不可重復讀,避免不可重復讀的方式:
重復讀(RR,MySQL默認級別):就是在開始讀取資料時,不允許修改操作,但會導致由于允許insert操作導致的事務結果出現不同,也就是幻讀,避免幻讀的方式::
序列化:序列化使事務串行順序執行,但會大大降低并發性能,
MySQL鎖機制
Innodb實作了兩種型別的行鎖:共享鎖,排他鎖,
共享鎖和排他鎖
共享鎖:允許一個事務讀一行,阻止其他事務獲得相同資料集的排他鎖,多個共享鎖是可以并行的,
排他鎖:獲取排他鎖的事務允許更新資料,阻止其他事務獲取相同資料集的共享鎖和排他鎖,
【復述一下】
假設事務A獲取了表中的行666,就相當于獲得了共享鎖,此時A可以讀取資料,其他事務也可以獲得行666的共享鎖,所以多個共享鎖是可以并行指的是多個事務可以讀取相同的行,但是一旦某行被獲取了共享鎖,就無法被其他事務獲取排他鎖,也就是說,行只能讀,不能寫,
然后A讀完了,事務B要對行666進行更新操作,就需要先獲得排他鎖,獲得排他鎖之后,其他事務就無法獲取行666的排他鎖和共享鎖,也就是說,在事務B更新資料的時候不允許其他事務讀或者更新,
所以排他鎖就是指只允許一個事務進行寫操作,在這個程序中,不允許其他事務讀,也不允許其他事務寫,
也就是說,排他鎖是串行的,不能被多個事務同時持有,但共享鎖可以,
【如何使用行鎖】
InnoDB行鎖是通過索引上的索引項來實作的,InnoDB這種行鎖實作特點意味者:只有通過索引條件檢索資料,InnoDB才會使用行級鎖,否則,InnoDB將使用表鎖!(這也是為什么需要進行索引優化的原因)
【行鎖定的范圍問題】
行鎖:對索引項加鎖,鎖定一條記錄
間隙鎖:
編程的思想源于生活,生活中的例子能幫助我們更好的理解一些編程中的思想,
生活中排隊的場景,小明,小紅,小花三個人依次站成一排,此時,如何讓新來的小剛不能站在小紅旁邊,這時候只要將小紅和她前面的小明之間的空隙封鎖,將小紅和她后面的小花之間的空隙封鎖,那么小剛就不能站到小紅的旁邊,
這里的小紅,小明,小花,小剛就是資料庫的一條條記錄,
他們之間的空隙也就是間隙,而封鎖他們之間距離的鎖,叫做間隙鎖,
間隙鎖的目的是為了防止幻讀
innodb自動使用間隙鎖的條件:
- 必須在RR級別下
- 檢索條件必須有索引(沒有索引的話,mysql會全表掃描,那樣會鎖定整張表所有的記錄,包括不存在的記錄,此時其他事務不能修改不能洗掉不能添加)
Next-key Lock:等于行鎖加間隙鎖,掃描索引記錄后,先對索引記錄加上行鎖,再對索引兩邊的間隙加上間隙鎖,
意向共享鎖和意向排他鎖
Innodb雖然使用行鎖,但并沒有廢棄表鎖,
【行鎖和表鎖】
MyISAM存盤引擎使用的是表鎖,而Innodb增加了行鎖,并不意味著Innodb徹底拋棄了表鎖,
關于行鎖,較小的粒度導致其高并發,但也因較小的粒度導致加鎖慢,開銷大,會出現死鎖情況,
關于表鎖,較大的粒度在高并發上的表現很弱,但同時粒度較大,加鎖塊,開銷小,不會出現死鎖情況,
沒有完美的技術,只有合適的解決方案,在高并發場景下使用行鎖而忍受一些問題本質上是一種權衡,
【意向鎖的背景沖突】
意向鎖的出現本質上是解決行鎖和表鎖矛盾的問題,
事務A獲得了表中某一行的共享鎖,事務B申請了表的寫權限,這時候就會產生矛盾,
【關于意向鎖】
首先,意向鎖是一種表鎖,
意向共享鎖:事務獲得表中的某一行的共享鎖前,需要先獲得整張表的意向共享鎖,
意向排他鎖:事務獲得表中的某一行的排他鎖前,需要先獲得整張表的意向排他鎖,
意向鎖的加鎖程序是自動完成的,
【意向鎖的共享問題】
意向鎖是表鎖,它的互斥性是針對表級別的事務,比如一個事務要獲取一張表的寫權限,所以意向鎖對于表級別的事務是互斥的,但是對于行級別的事務是共享的,也就是說,一個意向鎖可以被多個行級別的事務所持有,
死鎖
關于死鎖抖音上有一個非常好玩的小視頻:
面試官問:解釋一下死鎖,解釋明白了就發offer
應聘者答:先發offer,發了offer再解釋
死鎖本質上就是持有鎖和釋放鎖的問題,就像這個視頻里描述的,面試官在聽到死鎖的解釋后,才會釋放offer這個鎖,而應聘者是得到offer后才會釋放死鎖解釋這個鎖,offer和對死鎖的解釋就可以類比兩個鎖,
死鎖的狀態就是互相等待,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/109155.html
標籤:MySQL
下一篇:請教關于oracle授權問題
