@Transactional事务之timeout属性失效解决思路

博客分析了一个生产环境中出现的接口返回失败但实际操作成功的异常情况。问题源于事务执行超出了接口设置的超时时间,导致接口提前返回错误。通过日志和代码审查,确认事务在超时后继续执行并最终完成入库。解决方案是为事务设置明确的超时时间,以确保事务与接口超时同步。示例展示了如何在Spring的声明式和编程式事务中设置超时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:生产环境出现写成功,接口却返回失败的场景

分析:先确认是否如他们反馈的现象一致,查询日志确认一致;接口进入和返回失败的时间间隔发现是5秒,与设置的接口超时时间一致,分析大概率是超时了,内部具体日志分析,定位到入库的事务执行耗时6秒多;查看代码,事务没有设置超时时间,默认不超时或根据数据库默认设置,经后期测试为是不超时;当事务超过接口超时时间后,接口直接返回超时失败,但是事务并没有结束,而是等待竞争锁资源,获取到锁后继续执行,并且入库成功;从而赵成接口返回失败,实际入库成功的不一致现象;

解决办法:设置超时时间

1.spring的声明式事务:

@Transactional(rollbackFor = Exception.class, timeout = 3)

2.编程式事务

//开启事务
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
// 事物隔离级别,开启新事务
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
// 事务超时时间(秒)
def.setTimeout(3);
// 获得事务状态
TransactionStatus status = transactionManager.getTransaction(def);
try {
  ...
  //提交事务
  transactionManager.commit(status);
  log.info("成功");
} catch (TransactionTimedOutException e){
    transactionManager.rollback(status);
    log.error("超时异常:", e);
} catch (Exception e) {
    transactionManager.rollback(status);
    log.error("异常:", e);
}

好记性不如烂笔头!

在使用@Transactional注解时,有几个注意事项需要牢记: 1. 开启事务管理:确保你的应用程序已经配置了事务管理器,以便@Transactional注解能够生效。这通常需要在配置文件中配置一个事务管理器(如Spring中的PlatformTransactionManager),并将其与你的数据源相关联。 2. 作用范围:@Transactional注解可以应用于类级别或方法级别。当应用于类级别时,所有在该类中定义的方法都将具有事务管理。当应用于方法级别时,只有被注解的方法才会被事务管理。 3. 事务传播行为:@Transactional注解允许你设置事务的传播行为。默认情况下,事务传播行为为REQUIRED,这意味着如果当前没有事务存在,则创建一个新的事务;如果已存在事务,则加入到该事务中。你还可以根据需要设置其他传播行为,如REQUIRES_NEW、SUPPORTS、NOT_SUPPORTED等。 4. 异常处理:当使用@Transactional注解时,如果被注解的方法抛出了未捕获的异常,事务将会回滚。你可以使用rollbackFor属性来指定哪些异常触发回滚操作。另外,你还可以通过使用noRollbackFor属性来指定哪些异常不触发回滚操作。 5. 事务超时:你可以通过timeout属性设置事务的超时时间(以秒为单位)。如果事务的执行时间超过了指定的超时时间,事务将会被强制回滚。 6. 异步方法:在异步方法上使用@Transactional注解可能会导致事务失效。这是因为事务管理器无法拦截异步方法的调用。如果你需要在异步方法中使用事务,请确保你的异步方法是通过另一个被注解的方法调用的。 7. 自我调用:当在同一个类中的一个被注解方法直接调用另一个被注解的方法时,事务可能不会生效。这是因为Spring AOP使用了基于代理的机制,只有通过代理对象调用才能触发事务的拦截。为了解决这个问题,你可以将被调用的方法抽取到另一个类中,并通过依赖注入来获取该类的实例。 这些是使用@Transactional注解时需要注意的一些事项。遵循这些注意事项可以确保事务的正确性和一致性。同时,建议在使用@Transactional注解之前对事务管理和相关概念进行深入了解,以便更好地应用和调整事务处理行为。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值