在之前简单介绍了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 {}; }