报错文案
(表名包名等敏感信息已替换)
1 | Error updating database. Cause: com.mysql.cj.jdbc.exceptions.MySQLTransactionRollbackException: Lock wait timeout exceeded; try restarting transaction |
报错场景一
商户 A 的人员批量平移到商户 B:
对 A 商户的人员要做的操作:
- 修改在职状态为【已离职】
- 生成解除协议
在 B 商户要做的操作
- 拷贝平移人员数据,插入表中
- B 商户的这波人为【在职】,需要生成劳动合同,并将生成的劳动合同的 id 更新到对应的人员身上
问题原因:
对 A 商户人员的操作和对 B 商户的批量人员操作放在一个 大事务 T1 里,然后劳动合同更新到 B 商户采用的是异步方式(也是一个事务 T2);T1 事务尚未提交,T2 事务要对 T1 事务里 B 商户的人员更新合同 id,造成锁超时,导致报错。
报错场景二【锁冲突】
用工后台【发起签约】操作时,会调用我们中台修改合同接口;发起签约操作同时会发布消息,我们进行消费,消费的过程中有些条件会调用修改合同接口,两者调用发生冲突导致一个调用未拿到锁标记而返回失败造成接口调用失败。
解决方案 :后台的消息发布应该置后于调用我们中台编辑合同接口之前,先调用成功,再发布消息,这才是合理的。
(如果无先后顺序的业务,中台或者后台需要做接口重试)