国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

MySQL系列之-“事務”與“鎖”

IT那活兒 / 2456人閱讀
MySQL系列之-“事務”與“鎖”
點擊上方“IT那活兒”,關注后了解更多精彩內容!!!

事務的四大特性

No.1 原子性(Atomicity)

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

No.2 一致性(Consistency)

一致性是指事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之后都必須處于一致性狀態。
在事務開始和完成時,數據都必須保持一致狀態。

No.3 隔離性(Isolation)

數據庫系統提供一定的隔離機制,保證事務在不受外部并發操作影響的 "獨立"環境下運行。

No.4 持久性(Durability)

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

并發引發的數據庫問題


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

當兩個或多個事務選擇同一行,最初的事務修改的值,會被后面的事務修改的值覆蓋。

No.2 臟讀(dirty reads)

當一個事務正在訪問數據,并且對數據進行了修改,而這種修改還沒有提交到數據庫中,這時,另外一個事務也訪問這個數據,然后使用了這個數據。

No.3 不可重復讀(NonRepeatableReads)

一個事務在讀取某些數據后的某個時間,再次讀取以前讀過的數據,卻發現和以前讀出的數據不一致。

No.4 幻讀(Phantom Reads)

一個事務按照相同的查詢條件重新讀取以前查詢過的數據,卻發現其他事務插入了滿足其查詢條件的新數據

通過事務隔離級別解決事務并發


No.1 未提交讀READ-UNCOMMITTED

造成臟讀現象,存在臟讀、不可重復讀、幻讀的問題,通過鎖解決數據丟失更新的問題。
  • Session 1:

  • Session2:

No.2 讀已提交READ-COMMITTED

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

No.3 可重復讀(REPEATABLE READ)

mysql 默認級別,解決臟讀、不可重復讀的問題,存在幻讀的問題。使用 MMVC機制實現可重復讀。

No.4 串行化(SERIALIZABLE)

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

通過鎖解決并發事務數據一致性問題


No1. 事務鎖策略

1)樂觀鎖

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

2)悲觀鎖

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

No2. 鎖

1)Myisam引擎鎖總結

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

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

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

2)Innodb引擎鎖總結

  • Innodb鎖的二種鎖定方式:

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

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

  • Innodb行鎖的演示

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

  • 可重復讀的間隙鎖以及next-key鎖

當我們用范圍條件,而不是使用相等條件檢索數據,并請求共享或排他鎖時,InnoDB會給符合條件的已有數據進行加鎖;對于鍵值在條件范圍內但并不存在的記錄,叫做 "間隙(GAP)" ,InnoDB也會對這個 "間隙" 加鎖,這種鎖機制就是所謂的間隙鎖(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: 當前正在等待鎖定的數量
Innodb_row_lock_time: 從系統啟動到現在鎖定總時間長度
Innodb_row_lock_time_avg:每次等待所花平均時長
Innodb_row_lock_time_max:從系統啟動到現在等待最長的一次所花的時間
Innodb_row_lock_waits: 系統啟動后到現在總共等待的次數
當等待的次數很高,而且每次等待的時長也不小的時候,我們就需要分析系統中為什么會有如此多的等待,然后根據分析結果著手制定優化計劃。

3)鎖的優化建議

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

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

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

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

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



END


更多精彩干貨分享

點擊下方名片關注

IT那活兒


文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/129730.html

相關文章

  • 關于MySQL的知識點面試常見問題都在這里

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

    hss01248 評論0 收藏0
  • 關于MySQL的知識點面試常見問題都在這里

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

    newtrek 評論0 收藏0
  • 關于MySQL的知識點面試常見問題都在這里

    摘要:但是這將嚴重影響程序的性能。垂直分區的優點在于可以使得行數據變小,在查詢時減少讀取的數,減少次數。此外,垂直分區可以簡化表的結構,易于維護。垂直分區的缺點在于主鍵會出現冗余,需要管理冗余列,并會引起操作,可以通過在應用層進行來解決。 Java面試通關手冊(Java學習指南,歡迎Star,會一直完善下去,歡迎建議和指導):https://github.com/Snailclimb/Jav...

    LeoHsiun 評論0 收藏0

發表評論

0條評論

IT那活兒

|高級講師

TA的文章

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