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

InnoDB數(shù)據(jù)庫死鎖問題處理

 更新時間:2016年03月16日 11:33:52   投稿:hebedich  
本文給大家講解的是mysql數(shù)據(jù)庫InnoDB類型,在update表的時候出現(xiàn)死鎖現(xiàn)象的原因及解決辦法,有需要的小伙伴可以參考下。

場景描述

在update表的時候出現(xiàn)DeadlockLoserDataAccessException異常 (Deadlock found when trying to get lock; try restarting transaction...)。

問題分析

這個異常并不會影響用戶使用,因為數(shù)據(jù)庫遇到死鎖會自動回滾并重試。用戶的感覺就是操作稍有卡頓。但是監(jiān)控老是報異常,所以需要解決一下。

解決方法

在應(yīng)用程序中update的地方使用try-catch。

我自己封裝了一個函數(shù),如下。

/**
   * 2016-03-15
   * linxuan
   * handle deadlock while update table
   */
  private void updateWithDeadLock(TestMapper mapper, Test record) throws InterruptedException {
    boolean oops;
    int retries = 5;
    do{
      oops = false;
      try{
        mapper.updateByPrimaryKeySelective(record);
      }
      catch (DeadlockLoserDataAccessException dlEx){
        oops = true;
        Thread.sleep((long) (Math.random() * 500));
      }
      finally {
      }
    } while(oops == true && retries-- >0);
  }

我用的是mybatis,所以只需將mapper傳進(jìn)函數(shù),如果不用mybatis,需要自己創(chuàng)建并關(guān)閉數(shù)據(jù)庫連接。

延伸:數(shù)據(jù)庫死鎖

數(shù)據(jù)庫死鎖是事務(wù)性數(shù)據(jù)庫 (如SQL Server, MySql等)經(jīng)常遇到的問題。除非數(shù)據(jù)庫死鎖問題頻繁出現(xiàn)導(dǎo)致用戶無法操作,一般情況下數(shù)據(jù)庫死鎖問題不嚴(yán)重。在應(yīng)用程序中進(jìn)行try-catch就可以。那么數(shù)據(jù)死鎖是如何產(chǎn)生的呢?

InnoDB實現(xiàn)的是行鎖 (row level lock),分為共享鎖 (S) 和 互斥鎖 (X)。

共享鎖用于事務(wù)read一行。
互斥鎖用于事務(wù)update或delete一行。
當(dāng)客戶A持有共享鎖S,并請求互斥鎖X;同時客戶B持有互斥鎖X,并請求共享鎖S。以上情況,會發(fā)生數(shù)據(jù)庫死鎖。如果還不夠清楚,請看下面的例子。

數(shù)據(jù)庫死鎖例子

首先,客戶A創(chuàng)建一個表T,并向T中插入一條數(shù)據(jù),客戶A開始一個select事務(wù),所以拿著共享鎖S。

mysql> CREATE TABLE t (i INT) ENGINE = InnoDB;
Query OK, 0 rows affected (1.07 sec)

mysql> INSERT INTO t (i) VALUES(1);
Query OK, 1 row affected (0.09 sec)

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM t WHERE i = 1 LOCK IN SHARE MODE;
+------+
| i  |
+------+
|  1 |
+------+

然后,客戶B開始一個新事務(wù),新事務(wù)是delete表T中的唯一一條數(shù)據(jù)。

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

mysql> DELETE FROM t WHERE i = 1;

刪除操作需要互斥鎖 (X),但是互斥鎖X和共享鎖S是不能相容的。所以刪除事務(wù)被放到鎖請求隊列中,客戶B阻塞。

最后,客戶A也想刪除表T中的那條數(shù)據(jù):

mysql> DELETE FROM t WHERE i = 1;
ERROR 1213 (40001): Deadlock found when trying to get lock;
try restarting transaction

死鎖產(chǎn)生了!因為客戶A需要鎖X來刪除行,而客戶B拿著鎖X并正在等待客戶A釋放鎖S??纯纯蛻鬉,B的狀態(tài):

客戶A: 拿著鎖S,等待著客戶B釋放鎖X。
客戶B: 拿著鎖X,等待著客戶A釋放鎖S。

發(fā)生死鎖后,InnoDB會為對一個客戶產(chǎn)生錯誤信息并釋放鎖。返回給客戶的信息:

ERROR 1213 (40001): Deadlock found when trying to get lock;
try restarting transaction
所以,另一個客戶可以正常執(zhí)行任務(wù)。死鎖結(jié)束。

相關(guān)文章

  • MySQL如何改變表的存儲引擎方式

    MySQL如何改變表的存儲引擎方式

    這篇文章主要介紹了MySQL如何改變表的存儲引擎方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • MySql避免重復(fù)插入記錄的幾種方法

    MySql避免重復(fù)插入記錄的幾種方法

    本文章來給大家提供三種在mysql中避免重復(fù)插入記錄方法,主要是講到了ignore,Replace,ON DUPLICATE KEY UPDATE三種方法,有需要的朋友可以參考一下
    2013-08-08
  • Mysql 數(shù)字類型轉(zhuǎn)換函數(shù)

    Mysql 數(shù)字類型轉(zhuǎn)換函數(shù)

    Mysql 數(shù)字類型轉(zhuǎn)換函數(shù),有此需要的朋友可以參考下用法。
    2009-08-08
  • 探討MySQL?保存日期用哪種數(shù)據(jù)類型

    探討MySQL?保存日期用哪種數(shù)據(jù)類型

    在設(shè)計數(shù)據(jù)庫表時不可避免的需要用到時間類型,到底選擇那種數(shù)據(jù)類型來表示時間是一個值的討論的問題,這篇文章主要介紹了MySQL保存日期用哪種數(shù)據(jù)類型,需要的朋友可以參考下
    2023-08-08
  • mysql 死鎖和死鎖檢測的實現(xiàn)

    mysql 死鎖和死鎖檢測的實現(xiàn)

    MySQL提供了死鎖檢測機(jī)制,可以自動檢測和解決死鎖問題,本文主要介紹了mysql 死鎖和死鎖檢測的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-09-09
  • MYSQL5 masterslave數(shù)據(jù)同步配置方法

    MYSQL5 masterslave數(shù)據(jù)同步配置方法

    因線路或安全需要我們不得不考慮mysql的備份,特把mysql數(shù)據(jù)備份的方法整理下。
    2008-09-09
  • mysql修改密碼的三方法和忘記root密碼的解決方法

    mysql修改密碼的三方法和忘記root密碼的解決方法

    這篇文章主要介紹了mysql修改密碼的三方法和忘記root密碼的解決方法,需要的朋友可以參考下
    2014-02-02
  • 在VB.NET應(yīng)用中使用MySQL的方法

    在VB.NET應(yīng)用中使用MySQL的方法

    這篇文章主要介紹了在VB.NET應(yīng)用中使用MySQL的方法,操作基于Visual Studio IDE進(jìn)行,需要的朋友可以參考下
    2015-06-06
  • 帶你了解MySQL中的事件調(diào)度器EVENT

    帶你了解MySQL中的事件調(diào)度器EVENT

    這篇文章主要介紹了帶你了解MySQL中的事件調(diào)度器EVENT,幫助大家更好的理解和學(xué)習(xí)MySQL,感興趣的朋友可以了解下
    2020-08-08
  • mysql8.0.23 msi安裝超詳細(xì)教程

    mysql8.0.23 msi安裝超詳細(xì)教程

    這篇文章主要介紹了mysql8.0.23 msi安裝超詳細(xì)教程,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03

最新評論

龙游县| 宜宾市| 金昌市| 阆中市| 中山市| 屯门区| 西丰县| 宜昌市| 峨眉山市| 江达县| 滕州市| 兰考县| 庆阳市| 修水县| 南汇区| 兴仁县| 阜康市| 柯坪县| 酒泉市| 牙克石市| 永修县| 玉林市| 三台县| 合肥市| 巴林右旗| 炎陵县| 铜鼓县| 汪清县| 泰顺县| 达拉特旗| 新源县| 潍坊市| 稻城县| 洪洞县| 玉林市| 屏山县| 宁强县| 清徐县| 永丰县| 夏津县| 临湘市|