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

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

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

場(chǎng)景描述

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

問題分析

這個(gè)異常并不會(huì)影響用戶使用,因?yàn)閿?shù)據(jù)庫遇到死鎖會(huì)自動(dòng)回滾并重試。用戶的感覺就是操作稍有卡頓。但是監(jiān)控老是報(bào)異常,所以需要解決一下。

解決方法

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

我自己封裝了一個(gè)函數(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實(shí)現(xiàn)的是行鎖 (row level lock),分為共享鎖 (S) 和 互斥鎖 (X)。

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

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

首先,客戶A創(chuàng)建一個(gè)表T,并向T中插入一條數(shù)據(jù),客戶A開始一個(gè)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開始一個(gè)新事務(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ù)被放到鎖請(qǐng)求隊(duì)列中,客戶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)生了!因?yàn)榭蛻鬉需要鎖X來刪除行,而客戶B拿著鎖X并正在等待客戶A釋放鎖S。看看客戶A,B的狀態(tài):

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

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

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

相關(guān)文章

  • MySQL如何改變表的存儲(chǔ)引擎方式

    MySQL如何改變表的存儲(chǔ)引擎方式

    這篇文章主要介紹了MySQL如何改變表的存儲(chǔ)引擎方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    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è)計(jì)數(shù)據(jù)庫表時(shí)不可避免的需要用到時(shí)間類型,到底選擇那種數(shù)據(jù)類型來表示時(shí)間是一個(gè)值的討論的問題,這篇文章主要介紹了MySQL保存日期用哪種數(shù)據(jù)類型,需要的朋友可以參考下
    2023-08-08
  • mysql 死鎖和死鎖檢測(cè)的實(shí)現(xiàn)

    mysql 死鎖和死鎖檢測(cè)的實(shí)現(xiàn)

    MySQL提供了死鎖檢測(cè)機(jī)制,可以自動(dòng)檢測(cè)和解決死鎖問題,本文主要介紹了mysql 死鎖和死鎖檢測(cè)的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(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ì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03

最新評(píng)論

嘉义县| 闵行区| 项城市| 尼木县| 杭锦旗| 通城县| 新竹县| 茶陵县| 蒲城县| 溆浦县| 宁南县| 阳谷县| 洛隆县| 乌兰浩特市| 温州市| 南溪县| 镇坪县| 龙岩市| 南安市| 大悟县| 封开县| 宜宾市| 习水县| 郴州市| 柳州市| 枣庄市| 胶州市| 岐山县| 元谋县| 天等县| 蓝山县| 永泰县| 安徽省| 科技| 沿河| 万山特区| 谢通门县| 黄石市| 上饶市| 陈巴尔虎旗| 七台河市|