兰花豆豆
#1
【 使用环境 】生产环境
【 OB or 其他组件 】mysql模式
【 使用版本 】4.2.1
【问题描述】应用代码使用@Transactional管理事务,更新表T的某记录R,在提交事务前有个耗时操作(持续数小时),理论上在事务超时之前(配置的事务超时时间是6小时),其他线程是否无法记录R的,但是事实更新了。
【复现路径】@Transactional管理事务,在方法中更新表T的某记录R,模拟长耗时(超过6小时),然后再提交,与此同时开启其他线程更新R
【附件及日志】
【备注】基于 LLM 和开源文档 RAG 的论坛小助手已开放测试,在发帖时输入 [@论坛小助手] 即可召唤小助手,欢迎试用!
论坛小助手
#3
用户问题: 在OceanBase的MySQL模式下,当使用@Transactional
注解管理事务时,如果一个事务中的更新操作在提交前有耗时操作(持续数小时),理论上其他线程不应该能更新同一记录,但实际情况是其他线程可以更新该记录。使用的是4.2.1版本,事务超时时间为6小时。如何解决此问题?
推荐使用 obdiag 工具进行根因分析和日志采集,并且将采集到的日志提供给我们以便确认问题所在。
根因分析场景: 事务等待超时报错
根因分析命令: obdiag rca run --scene=transaction_wait_timeout
日志采集场景: 长事务
日志采集命令: obdiag gather scene run --scene=observer.long_transaction
麻烦您提供一些信息以便我们更好地帮助您:
- 您当前的隔离级别是什么?
- 能否提供具体的事务代码示例或 SQL 语句?
- 事务中是否有显式地设置锁?
- 系统中是否有配置与事务超时相关的参数?如果有,请提供具体的参数值。
- 是否有在业务逻辑中处理事务超时的机制?
- 当前遇到这个问题的具体频率是多少?
- 您是否已经尝试过调整事务超时时间来缓解这个问题?
- 能否提供事务执行时的日志片段,特别是关于锁等待的部分?
- 您是否在其他环境(如测试环境)中也观察到了同样的行为?
- 能否提供遇到此问题时的系统资源使用情况,如 CPU、内存和 IO 使用率?
附上敏捷诊断工具 obdiag 使用帮助链接
1 个赞
兰花豆豆
#5
成功了,从数据库的show variables能看到结果
兰花豆豆
#7
刚dba把线上这个事务对应的sql发来了,发现一个问题:这个事务里不仅包含了主线程的sql,还包含了子线程的sql,事务的传播属性是REQUIRED