【 使用环境 】生产环境
【 OB or 其他组件 】SpringBoot + druid + mybatis-pus + oceanbase(mysql模式)
【 使用版本 】3.1.12
【问题描述】 偶发性的产生长事务, 这些sql都不是在同一个方法栈里面的, 有的是其他业务方法的. 有部分是rabbitmq的监听方法onmessage里面的. 都没有加@Transactional注解. autocommit 都是true. 理应每个sql执行完就会自动提交sql, 但这些全部都卡住了, 变成了一个个长事务. 其他的服务没有出现过这种问题. 初次接触oceanbase, 不知道这种问题是怎样导致的, 有啥处理办法?谢谢!
【复现路径】偶发性. 暂不知.
【附件及日志】
类似的sql重复有几千条. 因为onmessage监听的是企微加好友的回调, 有时候是会有很多回调产生.
能贴一下你的druid + mybatis配置吗?
麻烦执行下这两个sql:
SELECT * FROM oceanbase.__all_virtual_trans_stat WHERE part_trans_action<=2 AND ctx_create_time < date_sub(now(), INTERVAL 600 SECOND) AND is_exiting != 1;
SELECT * FROM oceanbase.__all_virtual_trans_stat WHERE part_trans_action > 2 AND ctx_create_time < date_sub(now(), INTERVAL 600 SECOND) AND is_exiting != 1;
请问一下你这个是所有的语句都会被放到同一个事务里面卡主吗?如果不是的话,能提供下日志吗?可以先提供给我们2~3个异常期间日志(如涉及多个节点,请提供每个节点在相同时段的2~3个)。
这个问题有可能和springboot的全局事务管理有关,数据库里应该没有合并事务的行为。
怎么说? 全局事务都是默认的, 也没有任何事务注解和配置.
事务传播行为propagation
所谓事务的传播行为是指:如果在开始当前事务之前,一个事务上下文已进存在,此时有若干选项可以指定一个事务性方法的执行行为。在TransactionDefinition(事务定义)中包括了如下几个表示传播行为的常量:
常量 作用
PROPAGATION_REQUIRED 如果当前事务存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务,这是默认值。
PROPAGATION_REQUIRES_NEW 创建一个新的事务,如果当前存在事务,则把当前事务挂起
PROPAGATION_SUPPORTS 如果当前存在事务,则加入该事务;如果不存在事务,则以非事务的方式继续执行
PROPAGATION_NOT_SUPPORTED 以非事务机制运行,如果当前存在事务,则把当前事务挂起
PROPAGATION_NEVER 以非事务机制运行,如果当前存在事务,则抛出异常
PROPAGATION_MANDATORY 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常
PROPAGATION_NESTED 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于PROPAGATION_REQUIRED
spring boot 有事务传播行为选项,有可能合并事务。