一. 如下 对账表 数据结构

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 数据更新/删除导致锁表相关推荐

  1. Mysql InnoDB 数据更新/删除导致锁表

    一. 如下对账表数据结构 create table t_cgw_ckjnl (CNL_CODE varchar(10) default ' ' not null comment '通道编码',CNL_ ...

  2. DBeaver mysql 外键设置了级联删除,子表无法添加数据

    DBeaver mysql 外键设置了级联删除,子表无法添加数据 报错:Cannot add or update a child row: a foreign key constraint fails ...

  3. mysql锁表更新_Mysql InnoDB 数据更新导致锁表

    一.数据表结构 CREATE TABLE `jx_attach` ( `attach_id` int(11) NOT NULL AUTO_INCREMENT, `feed_id` int(11) DE ...

  4. Mysql 会导致锁表的语法

    转自:http://blog.csdn.net/lifaming15/article/details/47904557 最近再找一些MySQL锁表原因,整理出来一部分sql语句会锁表的,方便查阅,整理 ...

  5. mysql 导致锁表 count_mysql count 锁表

    数据库锁表与解锁 一.mysql 锁定表:LOCK TABLES tbl_nam... 数据库锁表与解锁 一.mysql 锁定表:LOCK TABLES tbl_nam... mysql锁测试_计算机 ...

  6. 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 ...

  7. php查询锁表情况,MySQL update where in 子查询导致锁表

    说实话,我第一次碰都这样的报错,因为我在 update 语句的条件里面使用了子查询,我以为执行会很快,因为子查询我试过,就一两秒的事情,数据也没多少个,90 来条数据,修改的条件是主键 ID,整个 S ...

  8. 锁表:MyISAM非聚集索引和InnoDB聚集索引的各种锁表问题

    参考文献 Mysql数据库中的各种锁_张花生的博客-CSDN博客_数据库锁 面试官:MySQL死锁有哪些场景?如何避免? 概述 相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存 ...

  9. mysql 5.6 ddl 锁表_MySQL数据库之MySQL5.6 Online DDL 是否锁表、rebuild表、inplace的说明...

    本文主要向大家介绍了MySQL数据库之MySQL5.6 Online DDL 是否锁表.rebuild表.inplace的说明 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. O ...

  10. mysql vip切换未重连问题_服务器断网事务未提交导致MYSQL锁表问题(ADSL拨号上网)...

    环境描述: 由于特殊原因服务器的网络是电信ADSL拨号上网的,用"自动切换IP精灵"进行自动断网重连,每次重新连上网络需要2s时间,设置2小时切换一次网络. MYSQL数据库在远程 ...

最新文章

  1. AngularJS 指令之 ng-hide/ng-show
  2. NEFU84——五指山(Exgcd)
  3. 当人工智能遇见农业,农民伯伯不再「粒粒皆辛苦」
  4. 漫谈高数——泰勒级数的物理意义
  5. 【转】世上最简单的vue教程
  6. 腾讯视频如何多倍速播放视频
  7. 笨小猴(信息学奥赛一本通-T1407)
  8. subtext blog装好了,老外的文档还是写的有些问题
  9. maven2+依赖传递
  10. 2019Java查漏补缺(二)
  11. 软件测试--缺陷报告常见问题03
  12. java使用Pattern、Matcher调用正则表达式
  13. 例4-2 刽子手游戏(Hangman Judge,UVa 489)
  14. GitHub上12k Star的《Java工程师成神之路》终于开放阅读了!
  15. 计算机word表格怎么求和,【Word文档怎么求和】- 虎课网
  16. 本机和Docker容器的文件传输
  17. Brenda-利用SOAP API访问Brenda及本地保存
  18. java数组初始化赋值_Java数组的三种初始化方式
  19. 软考答题卡的填涂注意事项?须知
  20. 密歇根大学最新成果:教会无人车预测行人运动趋势

热门文章

  1. 5.微服务:从设计到部署 --- 事件驱动数据管理
  2. 8. Linux 文件与目录管理
  3. 3. static file process
  4. 2. 配置Xdebug
  5. 第007讲 地图映射,线包字
  6. 青岛科技大学C语言程序设计,青岛科技大学c语言试题库
  7. hbase 二进制数据写入_HBase总结
  8. 从闭包到 语法糖 装饰器
  9. 如何给网站添加支付宝支付功能
  10. elementUI table 绑定数据