成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

MySQL系列之-“事務(wù)”與“鎖”

IT那活兒 / 2540人閱讀
MySQL系列之-“事務(wù)”與“鎖”
點(diǎn)擊上方“IT那活兒”,關(guān)注后了解更多精彩內(nèi)容?。?!

事務(wù)的四大特性

No.1 原子性(Atomicity)

原子性是指事務(wù)包含的所有操作要么全部成功,要么全部失敗回滾,因此事務(wù)的操作如果成功就必須要完全應(yīng)用到數(shù)據(jù)庫,如果操作失敗則不能對數(shù)據(jù)庫有任何影響。

No.2 一致性(Consistency)

一致性是指事務(wù)必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另一個一致性狀態(tài),也就是說一個事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)。
在事務(wù)開始和完成時,數(shù)據(jù)都必須保持一致狀態(tài)。

No.3 隔離性(Isolation)

數(shù)據(jù)庫系統(tǒng)提供一定的隔離機(jī)制,保證事務(wù)在不受外部并發(fā)操作影響的 "獨(dú)立"環(huán)境下運(yùn)行。

No.4 持久性(Durability)

持久性是指一個事務(wù)一旦被提交了,那么對數(shù)據(jù)庫中的數(shù)據(jù)的改變就是永久性的,即便是在數(shù)據(jù)庫系統(tǒng)遇到故障的情況下也不會丟失提交事務(wù)的操作。
事務(wù)完成之后,對于數(shù)據(jù)的修改是永久的。

并發(fā)引發(fā)的數(shù)據(jù)庫問題


No.1 數(shù)據(jù)丟失更新(update lost)

當(dāng)兩個或多個事務(wù)選擇同一行,最初的事務(wù)修改的值,會被后面的事務(wù)修改的值覆蓋。

No.2 臟讀(dirty reads)

當(dāng)一個事務(wù)正在訪問數(shù)據(jù),并且對數(shù)據(jù)進(jìn)行了修改,而這種修改還沒有提交到數(shù)據(jù)庫中,這時,另外一個事務(wù)也訪問這個數(shù)據(jù),然后使用了這個數(shù)據(jù)。

No.3 不可重復(fù)讀(NonRepeatableReads)

一個事務(wù)在讀取某些數(shù)據(jù)后的某個時間,再次讀取以前讀過的數(shù)據(jù),卻發(fā)現(xiàn)和以前讀出的數(shù)據(jù)不一致。

No.4 幻讀(Phantom Reads)

一個事務(wù)按照相同的查詢條件重新讀取以前查詢過的數(shù)據(jù),卻發(fā)現(xiàn)其他事務(wù)插入了滿足其查詢條件的新數(shù)據(jù)。

通過事務(wù)隔離級別解決事務(wù)并發(fā)


No.1 未提交讀READ-UNCOMMITTED

造成臟讀現(xiàn)象,存在臟讀、不可重復(fù)讀、幻讀的問題,通過鎖解決數(shù)據(jù)丟失更新的問題。
  • Session 1:

  • Session2:

No.2 讀已提交READ-COMMITTED

已提交讀隔離級別解決了臟讀的問題,但是出現(xiàn)了不可重復(fù)讀的問題,即事務(wù)B在兩次查詢的數(shù)據(jù)不一致,解決臟讀的問題,存在不可重復(fù)讀、幻讀的問題。
T2時刻無法讀到T1時刻未交提的數(shù)據(jù),T4時刻能讀到T3時刻的數(shù)據(jù)。

No.3 可重復(fù)讀(REPEATABLE READ)

mysql 默認(rèn)級別,解決臟讀、不可重復(fù)讀的問題,存在幻讀的問題。使用 MMVC機(jī)制實(shí)現(xiàn)可重復(fù)讀。

No.4 串行化(SERIALIZABLE)

mysql中事務(wù)隔離級別為serializable時會鎖表,因此不會出現(xiàn)幻讀的情況,這種隔離級別并發(fā)性極低,開發(fā)中很少會用到解決臟讀、不可重復(fù)讀、幻讀,可保證事務(wù)安全,但完全串行執(zhí)行,性能最低。

通過鎖解決并發(fā)事務(wù)數(shù)據(jù)一致性問題


No1. 事務(wù)鎖策略

1)樂觀鎖

在關(guān)系數(shù)據(jù)庫管理系統(tǒng)里,樂觀并發(fā)控制(又名“樂觀鎖”,Optimistic Concurrency Control,縮寫“OCC”)是一種并發(fā)控制的方法。它假設(shè)多用戶并發(fā)的事務(wù)在處理時不會彼此互相影響,各事務(wù)能夠在不產(chǎn)生鎖的情況下處理各自影響的那部分?jǐn)?shù)據(jù)。在提交數(shù)據(jù)更新之前,每個事務(wù)會先檢查在該事務(wù)讀取數(shù)據(jù)后,有沒有其他事務(wù)又修改了該數(shù)據(jù)。如果其他事務(wù)有更新的話,正在提交的事務(wù)會進(jìn)行回滾。
樂觀并發(fā)控制相信事務(wù)之間的數(shù)據(jù)競爭(data race)的概率是比較小的,因此盡可能直接做下去,直到提交的時候才去鎖定,所以不會產(chǎn)生任何鎖和死鎖。但如果直接簡單這么做,還是有可能會遇到不可預(yù)期的結(jié)果,例如兩個事務(wù)都讀取了數(shù)據(jù)庫的某一行,經(jīng)過修改以后寫回數(shù)據(jù)庫,這時就遇到了問題。
使用數(shù)據(jù)版本(Version)記錄機(jī)制實(shí)現(xiàn),這是樂觀鎖最常用的一種實(shí)現(xiàn)方式。何謂數(shù)據(jù)版本?即為數(shù)據(jù)增加一個版本標(biāo)識,一般是通過為數(shù)據(jù)庫表增加一個數(shù)字類型的 “version” 字段來實(shí)現(xiàn)。當(dāng)讀取數(shù)據(jù)時,將version字段的值一同讀出,數(shù)據(jù)每更新一次,對此version值加一。

2)悲觀鎖

在關(guān)系數(shù)據(jù)庫管理系統(tǒng)里,悲觀并發(fā)控制(又名“悲觀鎖”,Pessimistic Concurrency Control,縮寫“PCC”)是一種并發(fā)控制的方法。它可以阻止一個事務(wù)以影響其他用戶的方式來修改數(shù)據(jù)。如果一個事務(wù)執(zhí)行的操作都某行數(shù)據(jù)應(yīng)用了鎖,那只有當(dāng)這個事務(wù)把鎖釋放,其他事務(wù)才能夠執(zhí)行與該鎖沖突的操作。
悲觀并發(fā)控制主要用于數(shù)據(jù)爭用激烈的環(huán)境,以及發(fā)生并發(fā)沖突時使用鎖保護(hù)數(shù)據(jù)的成本要低于回滾事務(wù)的成本的環(huán)境中。
悲觀并發(fā)控制實(shí)際上是“先取鎖再訪問”的保守策略,為數(shù)據(jù)處理的安全提供了保證。但是在效率方面,處理加鎖的機(jī)制會讓數(shù)據(jù)庫產(chǎn)生額外的開銷,還有增加產(chǎn)生死鎖的機(jī)會;另外,在只讀型事務(wù)處理中由于不會產(chǎn)生沖突,也沒必要使用鎖,這樣做只能增加系統(tǒng)負(fù)載;還有會降低了并行性,一個事務(wù)如果鎖定了某行數(shù)據(jù),其他事務(wù)就必須等待該事務(wù)處理完才可以處理那行數(shù)。

No2. 鎖

1)Myisam引擎鎖總結(jié)

  • 對MyISAM 表的讀操作,不會阻塞其他用戶對同一表的讀請求,但會阻塞對同一表的寫請求;

  • 對MyISAM 表的寫操作,則會阻塞其他用戶對同一表的讀和寫操作;

簡而言之,就是讀鎖會阻塞寫,但是不會阻塞讀。而寫鎖,則既會阻塞讀,又會阻塞寫
此外,MyISAM 的讀寫鎖調(diào)度是寫優(yōu)先,這也是MyISAM不適合做寫為主的表的存儲引擎的原因。因?yàn)閷戞i后,其他線程不能做任何操作,大量的更新會使查詢很難得到鎖,從而造成永遠(yuǎn)阻塞。在mysql中,Myisam引擎開始只支持表鎖。
  • 查詢表爭用情況

2)Innodb引擎鎖總結(jié)

  • Innodb鎖的二種鎖定方式:

  1. 共享鎖(S):SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE

  2. 排他鎖(X) :SELECT * FROM table_name WHERE ... FOR UPDATE

  • Innodb行鎖的演示

  • 無索引表行鎖升級為表鎖

  • 可重復(fù)讀的間隙鎖以及next-key鎖

當(dāng)我們用范圍條件,而不是使用相等條件檢索數(shù)據(jù),并請求共享或排他鎖時,InnoDB會給符合條件的已有數(shù)據(jù)進(jìn)行加鎖;對于鍵值在條件范圍內(nèi)但并不存在的記錄,叫做 "間隙(GAP)" ,InnoDB也會對這個 "間隙" 加鎖,這種鎖機(jī)制就是所謂的間隙鎖(Next-Key鎖)
mysql> show status like innodb_row_lock%;
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
|
 Innodb_row_lock_current_waits | 0 |
| Innodb_row_lock_time | 24021 |
|
 Innodb_row_lock_time_avg | 6005 |
| Innodb_row_lock_time_max | 6007  |
|
 Innodb_row_lock_waits | 4 |
+-------------------------------+-------+
Innodb_row_lock_current_waits: 當(dāng)前正在等待鎖定的數(shù)量
Innodb_row_lock_time: 從系統(tǒng)啟動到現(xiàn)在鎖定總時間長度
Innodb_row_lock_time_avg:每次等待所花平均時長
Innodb_row_lock_time_max:從系統(tǒng)啟動到現(xiàn)在等待最長的一次所花的時間
Innodb_row_lock_waits: 系統(tǒng)啟動后到現(xiàn)在總共等待的次數(shù)
當(dāng)?shù)却拇螖?shù)很高,而且每次等待的時長也不小的時候,我們就需要分析系統(tǒng)中為什么會有如此多的等待,然后根據(jù)分析結(jié)果著手制定優(yōu)化計劃。

3)鎖的優(yōu)化建議

  • 盡可能讓所有數(shù)據(jù)檢索都能通過索引來完成,避免無索引行鎖升級為表鎖。

  • 合理設(shè)計索引,盡量縮小鎖的范圍

  • 盡可能減少索引條件,及索引范圍,避免間隙鎖

  • 盡量控制事務(wù)大小,減少鎖定資源量和時間長度

  • 盡可使用低級別事務(wù)隔離(但是需要業(yè)務(wù)層面滿足需求)



END


更多精彩干貨分享

點(diǎn)擊下方名片關(guān)注

IT那活兒


文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/129730.html

相關(guān)文章

  • 關(guān)于MySQL的知識點(diǎn)面試常見問題都在這里

    摘要:串行最高的隔離級別,完全服從的隔離級別。但是這將嚴(yán)重影響程序的性能。此外,垂直分區(qū)可以簡化表的結(jié)構(gòu),易于維護(hù)。 我自己總結(jié)的Java學(xué)習(xí)的一些知識點(diǎn)以及面試問題,目前已經(jīng)開源,會一直完善下去,歡迎建議和指導(dǎo)歡迎Star: https://github.com/Snailclimb/Java_Guide 書籍推薦 《高性能MySQL : 第3版》 文字教程推薦 MySQL 教程(菜鳥教程...

    hss01248 評論0 收藏0
  • 關(guān)于MySQL的知識點(diǎn)面試常見問題都在這里

    摘要:串行最高的隔離級別,完全服從的隔離級別。但是這將嚴(yán)重影響程序的性能。此外,垂直分區(qū)可以簡化表的結(jié)構(gòu),易于維護(hù)。 我自己總結(jié)的Java學(xué)習(xí)的一些知識點(diǎn)以及面試問題,目前已經(jīng)開源,會一直完善下去,歡迎建議和指導(dǎo)歡迎Star: https://github.com/Snailclimb/Java_Guide 書籍推薦 《高性能MySQL : 第3版》 文字教程推薦 MySQL 教程(菜鳥教程...

    newtrek 評論0 收藏0
  • 關(guān)于MySQL的知識點(diǎn)面試常見問題都在這里

    摘要:但是這將嚴(yán)重影響程序的性能。垂直分區(qū)的優(yōu)點(diǎn)在于可以使得行數(shù)據(jù)變小,在查詢時減少讀取的數(shù),減少次數(shù)。此外,垂直分區(qū)可以簡化表的結(jié)構(gòu),易于維護(hù)。垂直分區(qū)的缺點(diǎn)在于主鍵會出現(xiàn)冗余,需要管理冗余列,并會引起操作,可以通過在應(yīng)用層進(jìn)行來解決。 Java面試通關(guān)手冊(Java學(xué)習(xí)指南,歡迎Star,會一直完善下去,歡迎建議和指導(dǎo)):https://github.com/Snailclimb/Jav...

    LeoHsiun 評論0 收藏0

發(fā)表評論

0條評論

IT那活兒

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<