排查过程:

查看数据库 INNODB_LOCKS,未发现有死锁的记录。 查看 SHOW PROCESSLIST; 也未见异常进程; 通过Mysql的控制台,查询慢日志,也未找到有关此表的Mysql慢日志信息。

查询Mysql默认的所等待超时时间:

show variables like ‘innodb_lock_wait_timeout’; Variable_name Value innodb_lock_wait_timeout 50 那Spring事务默认的事务超时时间是-1,表示事务超时将依赖于数据库的事务超时时间,当前为50秒,也就是存在事务等待锁超过50秒还未拿到锁导致事务超时了。

业务重现:

后来我到业务控制台上进行业务重现

(批量商品打标),在查看 INNODB_LOCKS: product-put-tag-tx-lock 发现后台针对同一条数据存在两个事务,推测是第一个事务当前还在执行(可能比较慢),第二个是个事务又提交上来了(操作重复),所以对同一条数据尝试加X锁,发现已经有锁了,所以第二个事务会处于锁等待,由于我们Spring事务未配置超时时间,所以当前的事务超时时间为50秒,等待50秒之后就会出现超时,此时Mysql会抛出“Lock wait timeout exceeded; try restarting transaction”异常;除此之外,我们还需要考虑接口调用超时时间给业务带来的影响。

解决方案:

考虑到批量打标可以允许部分失败的场景,所以取出事务,捕获异常并进入异常队列; 由于单个打标非常耗时,批量更会增加执行时间,所以修改同步操作为异步操作; 把预先批量处理的业务拆分到单个业务处理逻辑中,减少预处理成功后续失败的场景; 由于打标可能出现网络超时,所以添加自动重试机制,减少错误概率;

批处理优化建议:

减少批处理的最小化单元,尽量减小锁的范围; 修改同步执行时间为异步执行,并且捕获异常; 一些异常场景不影响事务整体提交,允许部分场景下的异常; 设置合理的超时时间; 设置合理的执行数量限制;

其它思考:

假设一:

我们的打标任务被一个要求拥有事务保证的接口调用的时候,怎么保证整体的事务性?

答:这个属于分布式事务的范畴,可以参考分布式事务环节。

假设二:

我们的批量操作为内部接口,需要保证内部的事务性,比如我们通过购物车进行下单,为了提高系统的性能,需要一次对多个SKU进行扣库存逻辑,如果存在一个SKU的库存不够扣时,就需要整体回滚,在高并发场景下,扣库存就成为了耗时操作,这种场景下我们怎么处理呢 ?

答:在高并发场景下,如果我们只是采用原生Mysql的事务操作来做批量库存更新的话,会导致大量请求处于锁等待场景,为了加快处理,我们的做法是将库存数据放到redis中,把数据库操作转化为redis操作,如果使用单机版的redis,虽然redis提供事务功能,但是事务并不具备完整性,因为不支持回滚操作,其次一般公司随着业务的发展,单机不能满足性能要求,会搭建Redis-Cluster集群,Redis-Cluster不支持事务操作,multi-key操作也必须在同一个节点中才能使用,虽然我们库存操作的是Redis读操作,但是写的时候还是用的Mysql的悲观锁,也未能解决这个写入的性能问题。

更多文章请关注订yue号:java_xuetang。

Lock wait timeout exceeded; try restarting transaction相关推荐

  1. 数据库 1205 Error 'Lock wait timeout exceeded; try restarting transaction' on query

    收到报警,mysql的从数据库在同步的过程出现问题,已停止同步. mysql> show slave status\G *************************** 1. row ** ...

  2. mysql 中lock wait_应用中MYSQL 报错Lock wait timeout exceeded; try restarting transaction

    最近开发的应用开始做性能测试.在小于80用户并发的时候一切OK,并发量到100用户时,持续压5分钟.应用开始报错,并且只有1次错误,持续时间长,比如10分钟,会报3次. 日志如下: Caused by ...

  3. 'Lock wait timeout exceeded; try restarting transaction'问题

    OperationalError: (1205, 'Lock wait timeout exceeded; try restarting transaction') 原因很简单,太多错误,意外处理没有 ...

  4. 关于MySQL出现`lock wait timeout exceeded; try restarting transaction` 的解决方案

    关于MySQL出现lock wait timeout exceeded; try restarting transaction 的解决方案. 一.问题抛出 在做查询语句时,MySQL 抛出了这样的异常 ...

  5. MySQL -- Lock wait timeout exceeded; try restarting transaction参数控制

    Lock wait timeout exceeded; try restarting transaction 锁等待超时..回滚事务.. 当事务1  获得锁 start TRANSACTION upd ...

  6. 关于MySQL出现锁等待lock wait timeout exceeded; try restarting transaction 的解决方案

    关于MySQL出现lock wait timeout exceeded; try restarting transaction 的解决方案. 一.问题抛出 在做查询语句时,MySQL 抛出了这样的异常 ...

  7. ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

    前言:朋友咨询我说执行简单的update语句失效,症状如下: mysql> update order_info  set province_id=15  ,city_id= 1667  wher ...

  8. mysql死锁释放时间参数_【Mysql】mysql 事务未提交导致死锁 Lock wait timeout exceeded; try restarting transaction 解决办法...

    问题场景 问题出现环境: 1.在同一事务内先后对同一条数据进行插入和更新操作: 2.多台服务器操作同一数据库: 3.瞬时出现高并发现象: 不断的有一下异常抛出,异常信息: org.springfram ...

  9. 【问题解决:死锁】Lock wait timeout exceeded; try restarting transaction的问题

    执行数据删除操作时一直超时并弹出Lock wait timeout exceeded; try restarting transaction错误 解决办法 1.先查看数据库的事务隔离级别 select ...

最新文章

  1. 我为我Windows Home Server 预热
  2. 天水市荣膺“2016中国智慧城市创新奖”
  3. 树-当前结点与列表页不符的处理
  4. 人工机器:jetbot小车密码
  5. 外卖行业现状分析_我国外卖行业发展现状与趋势一览
  6. AgileEAS.NET平台开发Step By Step系列-药店系统-索引
  7. android 自定义progressdialog,android自定义ProgressDialog加载效果
  8. 百度要召集 600 名深度学习开发者搞事情? 首届深度学习开发者峰会等你来
  9. 自走棋投降代码_自走棋太火惨遭针对!代码哥之后又是锁钱挂?玩家:还有拒绝员!...
  10. Atitit..文件上传组件选型and最佳实践总结(2)----断点续传
  11. A股管家股票自动交易软件系统,功能完善强大
  12. 快速回复信息神器免费的有哪些,哪些工具可以快捷回复
  13. matlab的实时编辑器介绍以及应用示例
  14. 《Android开发艺术探索》超详细笔记【转载】
  15. VMware Workstation 12 Pro 安装 mac最新系统版本10.12.3
  16. VUE中的img的:src动态加载图片的问题,require也不能随便用
  17. 腾讯又一长达 8 年的服务下架。。。
  18. Hadoop集群搭建(三台Linux服务器)
  19. 二极管、三极管、晶闸管基本知识
  20. SQL server安装时:“以前的某个程序安装已在安装计算机上创建挂起的文件操作。运行安装程序之前必须重新启动计算机”错误

热门文章

  1. 小程序与php 实现微信支付
  2. C语言中free函数如何确定释放的空间大小
  3. 向量的2-范数、矩阵的2-范数
  4. 负值最大与 Alpha-Beta 剪枝的结合
  5. Hessian矩阵\海塞矩阵\海森矩阵
  6. v-if 和 v-show的区别 vue面试题
  7. Cannot access ‘phone‘ before initialization
  8. 关于ES自定义script painless的问题
  9. MyBatis - 批量插入
  10. (dedecms)织梦搬家后无法更新栏目