最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

mysql數(shù)據(jù)庫鎖的產生原因及解決辦法

 更新時間:2016年01月14日 21:59:26   投稿:mdxy-dxy  
這篇文章主要介紹了mysql數(shù)據(jù)庫鎖的產生原因及解決辦法,需要的朋友可以參考下

數(shù)據(jù)庫和操作系統(tǒng)一樣,是一個多用戶使用的共享資源。當多個用戶并發(fā)地存取數(shù)據(jù) 時,在數(shù)據(jù)庫中就會產生多個事務同時存取同一數(shù)據(jù)的情況。若對并發(fā)操作不加控制就可能會讀取和存儲不正確的數(shù)據(jù),破壞數(shù)據(jù)庫的一致性。加鎖是實現(xiàn)數(shù)據(jù)庫并 發(fā)控制的一個非常重要的技術。在實際應用中經常會遇到的與鎖相關的異常情況,當兩個事務需要一組有沖突的鎖,而不能將事務繼續(xù)下去的話,就會出現(xiàn)死鎖,嚴 重影響應用的正常執(zhí)行。

在數(shù)據(jù)庫中有兩種基本的鎖類型:排它鎖(Exclusive Locks,即X鎖)和共享鎖(Share Locks,即S鎖)。當數(shù)據(jù)對象被加上排它鎖時,其他的事務不能對它讀取和修改。加了共享鎖的數(shù)據(jù)對象可以被其他事務讀取,但不能修改。數(shù)據(jù)庫利用這兩 種基本的鎖類型來對數(shù)據(jù)庫的事務進行并發(fā)控制。

死鎖的第一種情況

一個用戶A 訪問表A(鎖住了表A),然后又訪問表B;另一個用戶B 訪問表B(鎖住了表B),然后企圖訪問表A;這時用戶A由于用戶B已經鎖住表B,它必須等待用戶B釋放表B才能繼續(xù),同樣用戶B要等用戶A釋放表A才能繼續(xù),這就死鎖就產生了。

解決方法:

這種死鎖比較常見,是由于程序的BUG產生的,除了調整的程序的邏輯沒有其它的辦法。仔細分析程序的邏輯,對于數(shù)據(jù)庫的多表操作時,盡量按照相同的順序進 行處理,盡量避免同時鎖定兩個資源,如操作A和B兩張表時,總是按先A后B的順序處理, 必須同時鎖定兩個資源時,要保證在任何時刻都應該按照相同的順序來鎖定資源。

死鎖的第二種情況

用戶A查詢一條紀錄,然后修改該條紀錄;這時用戶B修改該條紀錄,這時用戶A的事務里鎖的性質由查詢的共享鎖企圖上升到獨占鎖,而用戶B里的獨占鎖由于A 有共享鎖存在所以必須等A釋放掉共享鎖,而A由于B的獨占鎖而無法上升的獨占鎖也就不可能釋放共享鎖,于是出現(xiàn)了死鎖。這種死鎖比較隱蔽,但在稍大點的項 目中經常發(fā)生。如在某項目中,頁面上的按鈕點擊后,沒有使按鈕立刻失效,使得用戶會多次快速點擊同一按鈕,這樣同一段代碼對數(shù)據(jù)庫同一條記錄進行多次操 作,很容易就出現(xiàn)這種死鎖的情況。

解決方法:

1、對于按鈕等控件,點擊后使其立刻失效,不讓用戶重復點擊,避免對同時對同一條記錄操作。
2、使用樂觀鎖進行控制。樂觀鎖大多是基于數(shù)據(jù)版本(Version)記錄機制實現(xiàn)。即為數(shù)據(jù)增加一個版本標識,在基于數(shù)據(jù)庫表的版本解決方案中,一般是 通過為數(shù)據(jù)庫表增加一個“version”字段來實現(xiàn)。讀取出數(shù)據(jù)時,將此版本號一同讀出,之后更新時,對此版本號加一。此時,將提交數(shù)據(jù)的版本數(shù)據(jù)與數(shù) 據(jù)庫表對應記錄的當前版本信息進行比對,如果提交的數(shù)據(jù)版本號大于數(shù)據(jù)庫表當前版本號,則予以更新,否則認為是過期數(shù)據(jù)。樂觀鎖機制避免了長事務中的數(shù)據(jù) 庫加鎖開銷(用戶A和用戶B操作過程中,都沒有對數(shù)據(jù)庫數(shù)據(jù)加鎖),大大提升了大并發(fā)量下的系統(tǒng)整體性能表現(xiàn)。Hibernate 在其數(shù)據(jù)訪問引擎中內置了樂觀鎖實現(xiàn)。需要注意的是,由于樂觀鎖機制是在我們的系統(tǒng)中實現(xiàn),來自外部系統(tǒng)的用戶更新操作不受我們系統(tǒng)的控制,因此可能會造 成臟數(shù)據(jù)被更新到數(shù)據(jù)庫中。
3、使用悲觀鎖進行控制。悲觀鎖大多數(shù)情況下依靠數(shù)據(jù)庫的鎖機制實現(xiàn),如Oracle的Select … for update語句,以保證操作最大程度的獨占性。但隨之而來的就是數(shù)據(jù)庫性能的大量開銷,特別是對長事務而言,這樣的開銷往往無法承受。如一個金融系統(tǒng), 當某個操作員讀取用戶的數(shù)據(jù),并在讀出的用戶數(shù)據(jù)的基礎上進行修改時(如更改用戶賬戶余額),如果采用悲觀鎖機制,也就意味著整個操作過程中(從操作員讀 出數(shù)據(jù)、開始修改直至提交修改結果的全過程,甚至還包括操作員中途去煮咖啡的時間),數(shù)據(jù)庫記錄始終處于加鎖狀態(tài),可以想見,如果面對成百上千個并發(fā),這 樣的情況將導致災難性的后果。所以,采用悲觀鎖進行控制時一定要考慮清楚。

死鎖的第三種情況

如果在事務中執(zhí)行了一條不滿足條件的update語句,則執(zhí)行全表掃描,把行級鎖上升為表級鎖,多個這樣的事務執(zhí)行后,就很容易產生死鎖和阻塞。類似的情 況還有當表中的數(shù)據(jù)量非常龐大而索引建的過少或不合適的時候,使得經常發(fā)生全表掃描,最終應用系統(tǒng)會越來越慢,最終發(fā)生阻塞或死鎖。

解決方法:

SQL語句中不要使用太復雜的關聯(lián)多表的查詢;使用“執(zhí)行計劃”對SQL語句進行分析,對于有全表掃描的SQL語句,建立相應的索引進行優(yōu)化。
5.小結
總體上來說,產生內存溢出與鎖表都是由于代碼寫的不好造成的,因此提高代碼的質量是最根本的解決辦法。有的人認為先把功能實現(xiàn),有BUG時再在測試階段進 行修正,這種想法是錯誤的。正如一件產品的質量是在生產制造的過程中決定的,而不是質量檢測時決定的,軟件的質量在設計與編碼階段就已經決定了,測試只是 對軟件質量的一個驗證,因為測試不可能找出軟件中所有的BUG。

相關文章

  • MySQL必備基礎之分組函數(shù) 聚合函數(shù) 分組查詢詳解

    MySQL必備基礎之分組函數(shù) 聚合函數(shù) 分組查詢詳解

    這篇文章主要介紹了MySQL分組函數(shù)、聚合函數(shù)、分組查詢,結合實例形式分析了MySQL查詢分組函數(shù)以及查詢聚合函數(shù)相關使用技巧,需要的朋友可以參考下
    2021-10-10
  • mysql 8.0.12 解壓版安裝教程

    mysql 8.0.12 解壓版安裝教程

    這篇文章主要為大家詳細介紹了mysql 8.0.12 解壓版安裝教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-08-08
  • mysql開啟慢查詢(EXPLAIN SQL語句使用介紹)

    mysql開啟慢查詢(EXPLAIN SQL語句使用介紹)

    這篇文章主要介紹了mysql開啟慢查詢 EXPLAIN SQL語句,需要的朋友可以參考下
    2018-01-01
  • MySQL8.0.23免安裝版配置詳細教程

    MySQL8.0.23免安裝版配置詳細教程

    這篇文章主要介紹了MySQL8.0.23免安裝版配置教程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • MySQL如何使用使用Xtrabackup進行備份和恢復

    MySQL如何使用使用Xtrabackup進行備份和恢復

    Xtrabackup是由Percona開發(fā)的一個開源軟件,可實現(xiàn)對InnoDB的數(shù)據(jù)備份,支持在線熱備份(備份時不影響數(shù)據(jù)讀寫)。本文講解如何使用該工具進行備份和恢復
    2021-06-06
  • mysql添加備注信息的實現(xiàn)

    mysql添加備注信息的實現(xiàn)

    這篇文章主要介紹了mysql添加備注信息的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • CentOs7.x安裝Mysql的詳細教程

    CentOs7.x安裝Mysql的詳細教程

    CentOS7的yum源中默認好像是沒有MySQL的。為了解決這個問題,我們要先下載mysql的repo源。下面通過本教程給大家詳細介紹CentOs7.x安裝Mysql的方法,一起看看吧
    2016-12-12
  • Linux下安裝MySQL教程

    Linux下安裝MySQL教程

    上一篇文章詳細介紹windows下MySQL安裝教程,這篇就從最基本的安裝MySQL-Linux環(huán)境開始,文章為繞MySQL安裝展開內容,需要的朋友可以參考一下
    2021-11-11
  • SQL刪除重復數(shù)據(jù)的實例教程

    SQL刪除重復數(shù)據(jù)的實例教程

    在使用SQL提數(shù)的時候,常會遇到表內有重復值的時候,下面這篇文章主要給大家介紹了關于SQL刪除重復數(shù)據(jù)的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-07-07
  • MySQL如何查看正在運行的SQL詳解

    MySQL如何查看正在運行的SQL詳解

    在項目開發(fā)里面總是要查看后臺執(zhí)行的sql語句,mysql數(shù)據(jù)庫也不例外,下面這篇文章主要給大家介紹了關于MySQL如何查看正在運行的SQL的相關資料,文中介紹的非常詳細,需要的朋友可以參考下
    2023-01-01

最新評論

涿鹿县| 库伦旗| 淮滨县| 洛隆县| 娄烦县| 福泉市| 巴马| 卓资县| 湘潭市| 邢台市| 浦城县| 营山县| 广灵县| 景宁| 洪泽县| 綦江县| 玛纳斯县| 台中市| 维西| 沁源县| 鄂伦春自治旗| 华容县| 嘉黎县| 崇礼县| 蒲江县| 定结县| 辽宁省| 江油市| 革吉县| 澄城县| 独山县| 麻城市| 怀远县| 潼关县| 定襄县| 卢龙县| 六盘水市| 休宁县| 扶沟县| 姜堰市| 巴南区|