Mysql自增列,併發插入時導致死鎖的問題

2021-10-09 19:57:50 字數 2041 閱讀 5141

有一張表需要每天定時遷移資料,採用的sql如下(表名已調整)

insert into   data_cache ( customerid,organizationid,createtime)

( select customerid,organizationid,createtime

from data

where 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,createtime

from data

where 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.deadlockloserdataacces***ception: preparedstatementcallback; 

mysql插入居然報了死鎖,還是兩條插入併發,在資料來源沒有交集的情況下,並且之前一直是正常。百思不得其解

移除掉快取表中的autoindex欄位,取消自增以及非空。重試正常。

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

詳情可以參閱:

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

可以輸入以下命令檢視設定:

show global variables
innodb_autoinc_lock_mode 2 

因為我們對連續沒什麼要求,所以採用效能最好的即可

Mysql 自增列 主鍵

mysql中假如有 id int auto increment,cid varchar 36 通常情況下都是 id設定為主鍵。假如要設定cid為主鍵。自增列id必需是唯一索引。create table temp id bigint not null auto increment comment 編號...

MySQL自增列id 插入的值大於id的自增值

從oracle切換到阿里雲 雲下的oracle資料需要同步到polardb mysql8 雲上的新系統 rds mysql5.7 資料也要同步到polardb的同一張表裡 rds庫中,有自己的id自增列,同步到polardb上使用rds自己生成的值 不使用polardb的id自增值 oracle資料...

mysql 自增列的建立

1.建表時就建立自增列 create table test id int auto increment primary key,name varchar 20 not null,password varchar 20 not null insert into test values null,aa ...