@Transactional不起作用的原因和解决方案

  • @Transactional不起作用
    • 原因
      @Transactional(rollbackFor = Exception.class)  
      public void testTransactional() {  
          Product product = new Product();  
          product.setName("测试事务");  
          product.setPrice(100.0);  
          productJpaRepository.save(product);  
          int j = 0;  
          int i = 1/j;  
      }  
        
      public void testTransactional1() {  
          this.testTransactional();  
      }
      
      • 同一个service类中,一个非事务方法A调用一个事务方法B时,会出现B的事务失效的情况,原因是因为内部方法调用的时候是调用原方法,而非代理方法。
    • 解决方案:
      • 方案一:
        • 将testTransactional1方法抽取到一个新的类里面
      • 方案二:
        • 在所属service类中,引入自身的代理类,然后在testTransactional1方法中使用代理类调用testTransactional方法,不过要注意的是,为了避免循环依赖,需要在引入时加上@Lazy 注解
          @Service  
          public class ProductService {  
              @Lazy  
              @Autowired  private ProductService selfProxy;
          
          	public void testTransactional1() {  
          	    selfProxy.testTransactional();  
          	}
          }
          
  • 关于@Transactional注解之前我一直以为只能用户实现接口的方法,也就是只能通过动态代理进行事务增强。后面才知道,除了动态代理,通过CGLIB也可以实现,方法实现接口不是必须的。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值