在之前简单介绍了spring事务的用法,在spring中,事务的传播属性和隔离级别比较多,因此抽出来,单独写一篇来解释
注意:@Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能。
为了方便使用,直接使用注解配置spring事务,Ctrl+单击
打开注解,我们可以看到这个注解内的方法属性,
下面我们来解释常用几个属性的取值:
package com.zs.service;import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.core.annotation.AliasFor; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation;@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Transactional {@AliasFor("transactionManager")String value() default "";@AliasFor("value")String transactionManager() default "";/*** 事务传播特性:* Propagation.REQUIRED 判断当前方法是否存在事务,如果不存在就创建一个新的事务,如果存在就使用当前的事务* Propagation.REQUIRES_NEW 判断当前方法是否存在事务,如果不存在事务就创建一个新的事务,* 如果存在事务,就把当前事务挂起,在启动一个新的事务* Propagation.NESTED 嵌套事务。判断当前方法是否存在事务,如果不存在就创建一个事务,如果存在事务就把当前事务挂起,* 再启动一个当前事务的子事务,这样如果父事务产生异常,那么即使子事务没有异常也会回滚。* Propagation.NEVER 当前方法不应该运行在事物中,如果有事务就抛出异常;* Propagation.NOT_SUPPORTED当前方法不应该有事务,如果有事务存在,将它挂起,以无事务状态运行* Propagation.MANDATORY 当前方法必须要在有事务方法中运行,不然就抛出异常;如果有事务,就加入当前事务。* Propagation.SUPPORTS 支持事务,如果有事务,就加入事务中,如果没有事务,就以无事物的方式运行;* @return*/Propagation propagation() default Propagation.REQUIRED;/*** 设置隔离级别* Isolation.DEFAULT 底层数据存储的默认隔离级别,sqlServer与oracle默认为已提交读* Isolation.READ_COMMITTED 已提交读 读取已提交数据(会出现不可重复读和幻读)* Isolation.READ_UNCOMMITTED 未提交读 读取未提交数据(会出现脏读, 不可重复读) 基本不使用;* Isolation.REPEATABLE_READ 可重复读 可重复读(会出现幻读);在一个事务中进行查询时,* 不允许读取其他事务update的数据,允许读取到其他事务提交的新增数据* Isolation.SERIALIZABLE 序列化* @return*/Isolation isolation() default Isolation.SERIALIZABLE;/*** 该属性用于设置事务的超时秒数,默认值为-1表示永不超时* @return*/int timeout() default -1;/*** 设置当前事务是否为只读事务,设置为true表示只读,false表示可读写,默认为false,* 如果当前事务为查询操作,可以设置为true,可以提高程序运行效率* @return*/boolean readOnly() default false;/*** 该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。* 如:@Transactional(rollbackFor = {NullPointerException.class,RuntimeException.class})* 表示空指针异常和运行时异常时回滚事务* @return*/Class<? extends Throwable>[] rollbackFor() default {};/*** 该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。* 与上面的区别就是,直接写异常名字,不需要写.class* 如:@Transactional(rollbackForClassName = {"NullPointerException","Exception"})* @return*/String[] rollbackForClassName() default {};/*** 该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚。* 如:@Transactional(noRollbackFor = {NullPointerException.class})* 表示当抛出空指针异常时,不回滚事务* @return*/Class<? extends Throwable>[] noRollbackFor() default {};/*** 该属性用于设置不需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,不进行事务回滚。* 如:@Transactional(noRollbackForClassName = {"NullPointerException","Exception"})* 很容易发现,与上面的两组是相对的,上面的是发生指定异常回滚,下面的是发生指定异常不回滚* @return*/String[] noRollbackForClassName() default {}; }