spring@Transactional事物使用的几点注意


首先贴一下@Transactional注解中常用参数说明

参数名称

功能描述

readOnly

该属性用于设置当前事务是否为只读事务

,设置为true表示只读,false则表示可读写,默认值为false。例如:@Transactional(readOnly=true)

rollbackFor

该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。例如:

指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)

指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, Exception.class})

rollbackForClassName

该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如:

指定单一异常类名称:@Transactional(rollbackForClassName="RuntimeException")

指定多个异常类名称:@Transactional(rollbackForClassName={"RuntimeException","Exception"})

noRollbackFor

该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。例如:

指定单一异常类:@Transactional(noRollbackFor=RuntimeException.class)

指定多个异常类:@Transactional(noRollbackFor={RuntimeException.class, Exception.class})

noRollbackForClassName

该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。例如:

指定单一异常类名称:@Transactional(noRollbackForClassName="RuntimeException")

指定多个异常类名称:

@Transactional(noRollbackForClassName={"RuntimeException","Exception"})

propagation

该属性用于设置事务的传播行为。

例如:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true)

isolation

该属性用于设置底层数据库的事务隔离级别,事务隔离级别用于处理多事务并发的情况,通常使用数据库的默认隔离级别即可,基本不需要进行设置

timeout

该属性用于设置事务的超时秒数,默认值为-1表示永不超时

1. 有事物方法调用其他无事物方法时,调用的方法也在事物范围内。如被调用方法也有@Transactional则看该注解具体配置的事物传播级别,默认为propagation=Propagation.NOT_SUPPORTED,包含事物。

2.无事物方法调用本类有事物方法时,被调用方法的事物不生效。原因为spring的@Transactional事务生效的一个前提是进行方法调用前经过拦截器TransactionInterceptor,而本类方法的调用为this.方法(),未经过拦截器处理。

      解决方案(分两步):

            ①(当前类名)AopContext.currentProxy().需调用方法();

            ②在spring配置文件中添加,

3. @Transactional 注解只能应用到 public 可见度的方法上。

4. Spring团队建议在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。在接口上使用 @Transactional 注解,只能当你设置了基于接口的代理时它才生效。因为注解是 不能继承的。

5. @Transactional注解默认只能处理error和RuntimeException及其子类等unchecked异常,要想处理checked异常(编译时异常)则需要配置为rollbackFor=RuntimeException.class。

6. 只读事物的应用场景: https://blog.csdn.net/andyzhaojianhui/article/details/51984157

你可能感兴趣的:(java语言及框架相关)