事务提前结束

【 使用环境 】生产环境
【 OB or 其他组件 】mysql模式
【 使用版本 】4.2.1
【问题描述】应用代码使用@Transactional管理事务,更新表T的某记录R,在提交事务前有个耗时操作(持续数小时),理论上在事务超时之前(配置的事务超时时间是6小时),其他线程是否无法记录R的,但是事实更新了。
【复现路径】@Transactional管理事务,在方法中更新表T的某记录R,模拟长耗时(超过6小时),然后再提交,与此同时开启其他线程更新R
【附件及日志】

【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!

用户问题: 在OceanBase的MySQL模式下,当使用@Transactional注解管理事务时,如果一个事务中的更新操作在提交前有耗时操作(持续数小时),理论上其他线程不应该能更新同一记录,但实际情况是其他线程可以更新该记录。使用的是4.2.1版本,事务超时时间为6小时。如何解决此问题?

推荐使用 obdiag 工具进行根因分析和日志采集,并且将采集到的日志提供给我们以便确认问题所在。
根因分析场景: 事务等待超时报错
根因分析命令: obdiag rca run --scene=transaction_wait_timeout
日志采集场景: 长事务
日志采集命令: obdiag gather scene run --scene=observer.long_transaction
麻烦您提供一些信息以便我们更好地帮助您:

  1. 您当前的隔离级别是什么?
  2. 能否提供具体的事务代码示例或 SQL 语句?
  3. 事务中是否有显式地设置锁?
  4. 系统中是否有配置与事务超时相关的参数?如果有,请提供具体的参数值。
  5. 是否有在业务逻辑中处理事务超时的机制?
  6. 当前遇到这个问题的具体频率是多少?
  7. 您是否已经尝试过调整事务超时时间来缓解这个问题?
  8. 能否提供事务执行时的日志片段,特别是关于锁等待的部分?
  9. 您是否在其他环境(如测试环境)中也观察到了同样的行为?
  10. 能否提供遇到此问题时的系统资源使用情况,如 CPU、内存和 IO 使用率?

附上敏捷诊断工具 obdiag 使用帮助链接

1 个赞

事务时间超时时间设置成功没有

成功了,从数据库的show variables能看到结果

  1. 您当前的隔离级别是什么?【读已提交】
  2. 能否提供具体的事务代码示例或 SQL 语句?【普通update语句,where条件是主键联合索引】
  3. 事务中是否有显式地设置锁?【没有】
  4. 系统中是否有配置与事务超时相关的参数?如果有,请提供具体的参数值。【事务空闲耗时和超时时间都是6小时,dba已确认】
  5. 是否有在业务逻辑中处理事务超时的机制?【无显示处理】
  6. 当前遇到这个问题的具体频率是多少?【生产必现】
  7. 您是否已经尝试过调整事务超时时间来缓解这个问题?【dba不建议调整】
  8. 能否提供事务执行时的日志片段,特别是关于锁等待的部分?【Lock wait timeout exceeded; try restarting transaction】
  9. 您是否在其他环境(如测试环境)中也观察到了同样的行为?【是的】
  10. 能否提供遇到此问题时的系统资源使用情况,如 CPU、内存和 IO 使用率?【系统资源无异常】

刚dba把线上这个事务对应的sql发来了,发现一个问题:这个事务里不仅包含了主线程的sql,还包含了子线程的sql,事务的传播属性是REQUIRED