spring 事物 @Transactional 详解

前言

spring 事物管理默认配置下如果,service中try{}catch{}中发生了异常,事物是不会回滚的。

原因

Spring默认情况下会对运行期捕获到的RunTimeException进行事务回滚。

例如

if(user){          
    try {         
        userDao.save(user);           
     } catch (Exception e) {          
        
     }         
 }  

解决方法

方法1

在catch中抛出运行时异常供spring捕获

if(user){          
    try {         
        userDao.save(user);           
     } catch (Exception e) {          
        throw new RuntimeException();      
     }         
 }  

方法2

在catch中手动回滚事物,现在在用

if(user){          
    try {         
        userDao.save(user);           
     } catch (Exception e) {          
        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();     
     }         
 }  

https://my.oschina.net/u/3714931/blog/1580753

方法3

配置@Transactional的参数

@Transactional(rollbackFor=Exception.class)

170448_UZbo_3714931.png

propagation:事务传播性设置,Propagation枚举类型。Spring支持的事务传播属性包括7种:

    PROPAGATION_MANDATORY:方法必须在事务中执行,否则抛出异常。

    PROPAGATION_NESTED:使方法运行在嵌套事务中,否则和PROPAGATION_REQUIRED一样。

    PROPAGATION_NEVER :当前方法永远不在事务中运行,否则抛出异常。

    PROPAGATION_NOT_SUPPORTED:定义为当前事务不支持的方法,在该方法执行期间正在运行的事务会被暂停

    PROPAGATION_REQUIRED:当前的方法必须运行在事务中,如果没有事务就新建一个事务。新事务和方法一起开始,随着方法返回或者抛出异常时终止。

    PROPAGATION_REQUIRED_NEW :当前方法必须新建一个事务,如果当前的事务正在运行则暂停。

    PROPAGATION_SUPPORTS :规定当前方法支持当前事务,但是如果没有事务在运行就使用非事务方法执行。

isolation:事务隔离性级别设置,Isolation枚举类型

    ISOLATION_DEFAULT :使用数据库默认的隔离级别

    ISOLATION_COMMITTED:允许其他事务已经提交的更新(防止脏读取)

    ISOLATION_READ_UNCOMMITTED:允许读取其他事务未提交的更新,会导致三个缺陷发生。执行速度最快

    ISOLATION_REPEATABLE_READ :除非事务自身更改了数据,否则事务多次读取的数据相同(防止脏数据,多次重复读取)

    ISOLATION_SERIALIZABLE:隔离级别最高,可以防止三个缺陷,但是速度最慢,影响性能。

readOnly:读写性事务,只读性事务,布尔型

timeout:超时时间,单位秒

rollbackFor:一组异常类的实例,遇到时必须进行回滚

rollbackForClassname:一组异常类的名字,遇到时必须进行回滚

noRollbackFor:一组异常类的实例,遇到时必须不回滚

noRollbackForClassname:一组异常类的名字,遇到时必须不回滚

转载于:https://my.oschina.net/u/3714931/blog/1611289

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java Spring Boot中,@Transactional是一个注解,用于标记一个方法或类需要进行事务管理。事务是一组操作的逻辑单元,要么全部成功执行,要么全部回滚。使用@Transactional注解可以确保在方法执行期间,如果发生异常或错误,所有对数据库的操作都会回滚到事务开始之前的状态。 当我们在一个方法上添加@Transactional注解时,Spring会自动为该方法创建一个事务,并在方法执行之前开启事务,在方法执行之后根据方法的执行结果决定是提交事务还是回滚事务。如果方法执行成功,事务将会被提交,如果方法执行失败,事务将会被回滚。 除了在方法上使用@Transactional注解,我们还可以将它应用于类级别。当我们在类级别上添加@Transactional注解时,该类中的所有方法都将被包装在一个事务中。 需要注意的是,@Transactional注解默认只对未检查异常(RuntimeException及其子类)进行回滚,对于检查异常(Exception及其子类)不会回滚。如果需要对检查异常进行回滚,可以使用@Transactional(rollbackFor = Exception.class)来指定回滚的异常类型。 另外,@Transactional注解还可以接收一些参数,用于配置事务的传播行为、隔离级别、超时时间等。例如,@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, timeout = 3600)。 总结一下,@Transactional注解是用于在Java Spring Boot中进行事务管理的注解,通过标记方法或类,可以确保一组操作要么全部成功执行,要么全部回滚。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值