Spring事务

一.事务管理在系统开发中是不可缺少的一部分,Spring提供了很好事务管理机制,主要分为编程式事务和声明式事务两种.

编程式事务:是指在代码中手动的管理管理事务的提交,回滚等操作,代码入侵性比较强.

try {
    //TODO something
     transactionManager.commit(status);
} catch (Exception e) {
    transactionManager.rollback(status);
    throw new InvoiceApplyException("异常失败");
}

声明式事务:基于AOP面向切面的,它将具体业务与事务处理 部分解耦,代码侵入性很低,所以,在实际开发中声明式事务用的比较多.声明式事务也有两种实现方式,一是基于TX和AOP的xml配置文件方式,二是基于@Transactional

    @Transactional
    @GetMapping("/test")
    public String test() {
    
        int insert = cityInfoDictMapper.insert(cityInfoDict);
    }

二.@Transactional介绍

1.@Transactional注解可以作用于哪些地方?

@Transactional可以作用在接口,类,类方法.

作用于类时,该类的所有public方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。虽然@Transactional注解可以作用于接口的代理时才会生效,另外@Transactional注解应该只被应用到public方法上,这是由Spring AOP的本质决定的。如果你在protected,private或者默认可见性的方法上使用@Transactional注解,这将被忽略,也不会抛出任何异常。默认情况下,只有来自外部的方法调用才会被AOP代理捕获,也就是,类内部方法调用本类内部的其他方法并不会引起事务行为,即时被调用方法使用@Transactional注解进行修饰。

2.propagation属性

propagation用于指定事务的传播行为,默认值为REQUIRED。propagation有七种类型,也就是事务属性传播行为方式。

 3.isolation属性

        isolation用于指定事务的隔离规则,默认值为DEFAULT。@Transactional的隔离规则和上文事务属性里面的隔离规则,如下图所示:

4.timeout用于设置事务的超时属性。

5. rollbackFor、rollbackForClassName、noRollbackFor、NoRollbackForClassName

        rollbackFor、rollbackForClassName用于设置那些异常需要回滚;noRollbackFor、noRollbackForClassName用于设置那些异常不需要回滚。他们就是在设置事务的回滚规则。

三、@Transactional使用失效的场景:

1、@Transactional应用在非public修饰的方法上。如果Transactional注解应用在非public修饰的方法上,Transactional将会失效。

2、@Transactional注解属性propagation设置错误

3、@Transactional注解属性rollbackFor设置错误

4、在内部没有添加@Transactional的方法,调用了@Transactional方法时,当你调用时,他也不会回滚。

5、就是在@Transactional方法内部捕获了异常,没有在catch代码块里面重新抛出异常,事务也不会回滚。

6、创建表时,引擎是否是InnerDB。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值