SpringMVC 注解事务

本文深入探讨Spring框架下事务管理的实现原理与配置方法,解析如何正确使用@Transactional注解及常见问题,如事务未生效和自调用事务失效的解决策略。

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

  1. 在需要事务的方法上,添加注解
 @Transactional
  1. 添加配置
    <!--事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>
    <!-- 使用注解事务,需要添加Transactional注解属性 -->
    <tx:annotation-driven transaction-manager="transactionManager" />

如果发现事务未生效,请确认@Transactional标注的方法及其子方法没有try/catch。

对于service中调用自身方法,自身方法声明了Transactional注解却事务未生效
@Service
public class MyServiceImpl implements MyService{

  public void test(){
    doTransaction();
  }

  @Transactional
  public void doTransaction(){}
}

外部controller调用 MyServiceImpl.test()方法,其中的doTransaction事务无效;
原因: Spring数据库事务约定的实现原理是AOP,而AOP原理是动态代理,在自调用过程中,是类自身的调用,而不是代理对象的调用,就不会产生AOP.

解决方案: 可以从容器中取出service来实现事务

@Service
public class MyServiceImpl implements MyService, ApplicationContextAware{
  
  private ApplicationContext applicationContext = null;
  @Override
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    this.applicationContext = applicationContext;
  }
  
  @Override
  public void test(){
    MyService service = applicationContext.getBean(MyService.class);
    service.doTransaction();
  }
  
  @Override
  @Transactional
  public void doTransaction(){}
}
    @Transactional
    public void test(){
        int res = fruitMapper.add(new Fruit("Apple", 12, Arrays.asList("a", "b", "c"))); //插入,由于事务,执行后数据库中并查看不到
        System.out.println(JSON.toJSONString(fruitMapper.selectAll())); // 通过代码查询,可以查询到刚才插入的数据
        fruitMapper.add(new Fruit("Apple1", 12, Arrays.asList("a", "b", "c")));
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值