日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Mysql自增列,并发插入时导致死锁的问题

發布時間:2024/9/20 数据库 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Mysql自增列,并发插入时导致死锁的问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

背景:

  有一張表需要每天定時遷移數據,采用的SQL如下(表名已調整)

insert into data_cache ( customerID,organizationID,createTime)( select customerID,organizationID,createTimefrom datawhere DATE(createTime) <= DATE(?)and autoIndex >= ? and autoIndex <= ?)

大體意思是根據autoIndex去判定那些數據需要遷移,在程序中已經分好區域了

比如1~100,101~200,201~300.

表結構如下:

兩張表的數據表結構均一致,如:

CREATE TABLE `data` (`customerID` varchar(50) NOT NULL COMMENT '客戶編號',`organizationID` varchar(50) DEFAULT NULL COMMENT '機構號',`createTime` timestamp NULL DEFAULT current_timestamp() COMMENT '創建時間',`lastModifiedDatetime` timestamp NULL DEFAULT current_timestamp() ON UPDATE current_timestamp() COMMENT '最近修改時間',`autoIndex` int(11) NOT NULL AUTO_INCREMENT COMMENT '索引',`modifyDate` timestamp NULL DEFAULT current_timestamp() ON UPDATE current_timestamp() COMMENT '修改日期',PRIMARY KEY (`customerID`),KEY `autoIndex` (`autoIndex`) USING BTREE) ENGINE=InnoDB AUTO_INCREMENT=468 DEFAULT CHARSET=utf8

之前測試環境,甚至生產環境都是正常的代碼,最近更新了數據庫,出現了死鎖異常如下:

insert into data_cache ( customerID,organizationID,createTime)( select customerID,organizationID,createTimefrom datawhere DATE(createTime) <= DATE(?)and autoIndex >= ? and autoIndex <= ?)

Deadlock found when trying to get lock; try restarting transaction; nested exception is com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction

    org.springframework.dao.DeadlockLoserDataAccessException: PreparedStatementCallback;?

問題:

    Mysql插入居然報了死鎖,還是兩條插入并發,在數據源沒有交集的情況下,并且之前一直是正常。百思不得其解

嘗試解決:

    移除掉緩存表中的autoIndex字段,取消自增以及非空。重試正常。

問題根源:

    其實真正的問題涉及到Mysql對自增的設計。

  詳情可以參閱:

  https://www.cnblogs.com/JiangLe/p/6362770.html

  大體就是數據庫的模式對這種自增插入有3種設置。原有的環境以及生產為2,更新后改為1導致的。

可以輸入以下命令查看設置:

show global variables

innodb_autoinc_lock_mode 2?

因為我們對連續沒什么要求,所以采用性能最好的即可

來源:https://www.cnblogs.com/liangwen/p/9815336.html

總結

以上是生活随笔為你收集整理的Mysql自增列,并发插入时导致死锁的问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。