mybatis mysql查询死锁_mybatis,死锁_关于事务中死锁的一个问题,mybatis,死锁,事务,spring,java - phpStudy...

关于事务中死锁的一个问题

各位大神,小弟在这里先祝大家新年快乐。

小弟最近遇到一个关于mysql事务的问题,由于技术底子太单薄,希望借助各位大神的力量解决一下。

问题描述:

现在有一个账户,该账户是为集成我们服务的第三方平台分配的,作用基本是用于扣款。

在账户表中有一个次数(账户金额)的一个字段,账户表使用的存储引擎为InnoDB。

第三方平台的终端用户在使用他们的某一项功能时(其实该功能时我们提供的),第三方平台来调我们的接口,然后我们就减一次上面说的那个次数(账户金额)。

其实,说白了就是减库存的问题。

第三方平台用户数量很多,可能会大量并发的过来使用该功能。

我方平台的这个接口,加了事务控制,使用的是spring4.3.2 + mybatis3.4.1

上面说了,账户表的存储引擎为InnoDB。所以,每次调用我们接口,我们在扣款的时候,应该是开启了行级锁,把该账户的这条数据锁住了。以后来的扣款,估计都在等待。

最近经常报出异常为:

Deadlock found when trying to get lock; try restarting transaction

我现在很疑惑,为什么是死锁?而不是等待锁超时呢?

如果为:Lock wait timeout exceeded; try restarting transaction

我想我可能会理解,但是Deadlock我就不解了。

因为,第一个扣款线程进来先锁住那行记录,第二第三...的扣款线程就在外面一直等着。

第一个线程提交事务,释放InnoDB行级锁,第二个线程进来获取锁...应该为这样的顺序。

mysql有一个等待锁的超时时间,如果超时,那么线程直接timeout。

这里应该不存在死锁的情况啊?我理解死锁应该为,多方牵制导致锁永远也释放不掉。

我这种情况不是释放不掉啊,线程提交或回滚就释放了的啊?

各位大神,帮忙解释解释这个问题吧,停基础的,但是小弟...不会...

相关阅读:

getMethod 的第二个参数是null和new Class[]{}的区别?

下拉菜单效果请问目前引用了jq 请问大家有没有合适的插件?

请问前辈们Spring里Model、ModelMap、ModelAndView有什么区别额

七牛 上传uploadtoken 怎么生成都是报错 T_T

chevereto安装出错

vue+webpack用vue-cli脚手架搭的项目,怎么放到php后台的各个控制器对应的view中

npm run dev 出现如下报错,请问如何解决?

为何linux要在很多地方放置java?

【python|scapy】sprintf输出时raw_string转string

java.lang.String cannot be cast to rh.com.app.domain.A

react怎么获取一个已经存在于html中的元素

正则表达式怎么匹配一个id为filelist的div元素?

关于webpack-dev-server的几个问题

为什么不能用datatables来添加在数据库中查到的数据

为什么要用Node,AJAX就可以访问后台APIS接口了?

vue.js 1.0+ input绑定输入完成后的回车事件为什么没用

Ionic 2 构建过程中报错 Duplicate identifier 'Promise'

给推荐几个火的node.js 框架。实用好上手!

这种乱码的原因是什么?

PHP 如何实现绑定其他域名访问?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值