jdbc mysql innodb 死锁 deadlock_Mysql InnoDB 数据更新/删除导致锁表
一. 如下 对账表 数据结构
create tablet_cgw_ckjnl
(
CNL_CODEvarchar(10) default ' ' not null comment '通道编码',
CNL_PLT_CDvarchar(32) default ' ' not null comment '通道平台号',
CNL_TYPvarchar(10) default ' ' not null comment '通道类型',
CHK_BAT_NOvarchar(32) default ' ' not null comment '对账批次号',
BAT_NOvarchar(32) default ' ' not null comment '交易批次号',
SEQ_NOvarchar(8) default ' ' not null comment '批次序列号',
CHK_ORD_NOvarchar(64) default ' ' not null comment '对账订单号',
CHK_TYPvarchar(10) default ' ' not null comment '对账类型',
CHK_MODvarchar(2) default ' ' not null comment '对账方式(预留:通道订单号、交易批次号+通道订单号、交易批次号+批次序列号)',
CHK_DTvarchar(8) default ' ' not null comment '对账日期',
CHK_TMvarchar(6) default ' ' not null comment '对账时间',
CHK_STSvarchar(1) default '0' not null comment '对账状态',
REQ_DTvarchar(8) default '0' not null comment '交易请求日期',
IIF_TYPvarchar(10) default '0' not null comment '接口类型',
ORD_NOvarchar(32) default '0' not null comment '交易订单号',
CGW_STSvarchar(2) default ' ' not null comment '交易状态',
TXN_AMTdecimal(18,2) not null comment '交易金额',
FEE_AMTdecimal(18,2) default '0.00' not null comment '手续费',
BAT_FLGvarchar(2) default ' ' not null comment '批量标识(B-批量,S-单笔)',
FIELDvarchar(64) null comment '备用字段',
TM_SMPvarchar(26) default ' ' not null comment '时间戳',
NOD_IDvarchar(32) null comment '交易来源',primary key(CHK_BAT_NO, CHK_ORD_NO)
)
comment'对账流水临时表' engine=InnoDB;
二. 现象
当两个对账交易同时发生时,因都对这个表执行如下delete操作,当2个delete语句同时发生时,产生死锁。
sql:
delete from T_CGW_CKJNL where chk_typ=#{chk_typ} and cnl_code=#{cnl_code} and cnl_plt_cd=#{cnl_plt_cd}
交易1异常:
INFO[11-02 13:58:01,697] -> update sql:[delete from T_CGW_CKJNL where chk_typ='SP' and cnl_code='EPCC' and cnl_plt_cd='Z2027533000016' ]
INFO[11-02 13:58:01,767] -> 对账执行异常,
java.lang.reflect.UndeclaredThrowableException
at com.sun.proxy.$Proxy256.deleteCkJnl(Unknown Source)
at com.murong.ecp.app.bpg.cgw.service.db.CgwCkJnlDBService.deleteCkJnl(CgwCkJnlDBService.java:29)
at com.murong.ecp.app.bpg.cgw.service.biz.CheckFlowService.check(CheckFlowService.java:352)
at com.murong.ecp.app.bpg.cgw.service.biz.CheckFlowService.checkExecute(CheckFlowService.java:116)
at com.murong.ecp.app.bpg.cgw.action.cgwchkbpc1.CheckFlowAction.doProcess(CheckFlowAction.java:61)
...
Nested Exception:
com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
java.lang.reflect.Constructor.newInstance(Constructor.java:423)
com.mysql.jdbc.Util.handleNewInstance(Util.java:377)
com.mysql.jdbc.Util.getInstance(Util.java:360)
com.mysql.jdbc.SQLError.createSQLException(SQLError.java:985)
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3887)
com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3823)
com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2435)
com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582)
com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2530)
com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1907)
com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2141)
com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2077)
com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2062)
org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:97)
org.apache.tomcat.dbcp.dbcp2.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:97)
...
java.lang.Thread.run(Thread.java:748)
交易2异常:
INFO[11-02 13:58:01,697] -> update sql:[delete from T_CGW_CKJNL where chk_typ='Refund' and cnl_code='EPCC' and cnl_plt_cd='Z2027533000016' ]
INFO[11-02 13:58:01,767] -> 对账执行异常,
java.lang.reflect.UndeclaredThrowableException
...
Nested Exception:
com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction
...
三. 解决办法
MySQL的InnoDB存储引擎支持行级锁,InnoDB的行锁是通过给索引项加锁实现的。这就意味着只有通过索引条件检索数据时,InnoDB才使用行锁,否则使用表锁。
上面的数据更新语句涉及到的字段chk_typ,cnl_code,cnl_plt_cd上都没有索引,所以并发时导致表被锁。
解决办法就是为字段chk_typ,cnl_code,cnl_plt_cd添加索引,将数据锁定范围的颗粒度降低为行级锁,这样可以更好的支持并发操作而不产生死锁。
四. 执行计划对比
EXPLAIN delete from T_CGW_CKJNL where chk_typ='Pay' and cnl_plt_cd='Z20275330000161' and cnl_code='EPCC'
没有索引时:
添加索引后:
其中,rows表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数。可见,没有索引时读取了所有行(表里共33条记录),而添加索引后只读取特定的1行。
ref:https://www.cnblogs.com/zmduan/p/5033047.html
jdbc mysql innodb 死锁 deadlock_Mysql InnoDB 数据更新/删除导致锁表相关推荐
- Mysql InnoDB 数据更新/删除导致锁表
一. 如下对账表数据结构 create table t_cgw_ckjnl (CNL_CODE varchar(10) default ' ' not null comment '通道编码',CNL_ ...
- DBeaver mysql 外键设置了级联删除,子表无法添加数据
DBeaver mysql 外键设置了级联删除,子表无法添加数据 报错:Cannot add or update a child row: a foreign key constraint fails ...
- mysql锁表更新_Mysql InnoDB 数据更新导致锁表
一.数据表结构 CREATE TABLE `jx_attach` ( `attach_id` int(11) NOT NULL AUTO_INCREMENT, `feed_id` int(11) DE ...
- Mysql 会导致锁表的语法
转自:http://blog.csdn.net/lifaming15/article/details/47904557 最近再找一些MySQL锁表原因,整理出来一部分sql语句会锁表的,方便查阅,整理 ...
- mysql 导致锁表 count_mysql count 锁表
数据库锁表与解锁 一.mysql 锁定表:LOCK TABLES tbl_nam... 数据库锁表与解锁 一.mysql 锁定表:LOCK TABLES tbl_nam... mysql锁测试_计算机 ...
- mysql innodb 死锁_mysql innodb 死锁分析
mysql Ver 14.14 Distrib 5.7.16, for linux-glibc2.5 (x86_64) using EditLine wrapper #mysql版本 5.7.16 C ...
- php查询锁表情况,MySQL update where in 子查询导致锁表
说实话,我第一次碰都这样的报错,因为我在 update 语句的条件里面使用了子查询,我以为执行会很快,因为子查询我试过,就一两秒的事情,数据也没多少个,90 来条数据,修改的条件是主键 ID,整个 S ...
- 锁表:MyISAM非聚集索引和InnoDB聚集索引的各种锁表问题
参考文献 Mysql数据库中的各种锁_张花生的博客-CSDN博客_数据库锁 面试官:MySQL死锁有哪些场景?如何避免? 概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存 ...
- mysql 5.6 ddl 锁表_MySQL数据库之MySQL5.6 Online DDL 是否锁表、rebuild表、inplace的说明...
本文主要向大家介绍了MySQL数据库之MySQL5.6 Online DDL 是否锁表.rebuild表.inplace的说明 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. O ...
- mysql vip切换未重连问题_服务器断网事务未提交导致MYSQL锁表问题(ADSL拨号上网)...
环境描述: 由于特殊原因服务器的网络是电信ADSL拨号上网的,用"自动切换IP精灵"进行自动断网重连,每次重新连上网络需要2s时间,设置2小时切换一次网络. MYSQL数据库在远程 ...
最新文章
- AngularJS 指令之 ng-hide/ng-show
- NEFU84——五指山(Exgcd)
- 当人工智能遇见农业,农民伯伯不再「粒粒皆辛苦」
- 漫谈高数——泰勒级数的物理意义
- 【转】世上最简单的vue教程
- 腾讯视频如何多倍速播放视频
- 笨小猴(信息学奥赛一本通-T1407)
- subtext blog装好了,老外的文档还是写的有些问题
- maven2+依赖传递
- 2019Java查漏补缺(二)
- 软件测试--缺陷报告常见问题03
- java使用Pattern、Matcher调用正则表达式
- 例4-2 刽子手游戏(Hangman Judge,UVa 489)
- GitHub上12k Star的《Java工程师成神之路》终于开放阅读了!
- 计算机word表格怎么求和,【Word文档怎么求和】- 虎课网
- 本机和Docker容器的文件传输
- Brenda-利用SOAP API访问Brenda及本地保存
- java数组初始化赋值_Java数组的三种初始化方式
- 软考答题卡的填涂注意事项?须知
- 密歇根大学最新成果:教会无人车预测行人运动趋势