Spring-事务相关
一、事务简介
- 事务作用:在数据层保障一系列的数据库操作同时成功/失败;
- Spring事务作用:在数据层或业务层保障一系列的数据库操作同时成功/失败;
二、Spring事务的实现
-
Spring实现事务的步骤:
-
1.业务层(service)接口上添加Spring事务管理:使用注解
@Transactional
方式- 注解式事务添加在业务层接口上而不会添加到业务层实现类中,降低耦合;
- 注解式事务添加在业务层接口上:表示该接口的所有实现方法均开始事务管理;
public interface AccountService { @Transactional public void transfer(String out, String in, Double money); }
-
2.设置事务管理器
- 在jdbc配置类中设置事务管理器;
@PropertySource("classpath:jdbc.properties") //配置引入的properties文件路径 public class JdbcConfig { ...... //设置事务管理器 @Bean public PlatformTransactionManager getTransactionManager(DataSource dataSource){ DataSourceTransactionManager ptm = new DataSourceTransactionManager(); ptm.setDataSource(dataSource); return ptm; } }
-
3.开启注解式事务驱动
@Configuration //声明该类为配置类 @ComponentScan({"com.sea"}) //配置bean扫描的包路径 @Import({JdbcConfig.class, MybatisConfig.class}) //引入其他配置类 @EnableTransactionManagement //开启注解式事务驱动 public class SpringConfig { }
-
三、Spring事务角色
-
事务角色包括:
-
事务管理员:发起事务方,在Spring中通常指代业务层开启事务的方法;
-
例如:
@Transactional public void transfer(String out, String in, Double money);
-
-
事务协调员:加入事务方,在Spring中通常指代数据层的方法,也可以是业务层方法;
-
例如:
@Repository public interface AccountDao { @Update("update tb_account set money = money + #{money} where name = #{name}") void inMoney(@Param("name") String name, @Param("money") Double money); @Update("update tb_account set money = money - #{money} where name = #{name}") void outMoney(@Param("name") String name, @Param("money") Double money); }
-
-
四、Spring事务属性
4.1 事务属性介绍
-
按住
Ctrl
+鼠标左键点击注解@Transactional
进入Spring事务注解的属性信息:@Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Transactional { @AliasFor("transactionManager") String value() default ""; @AliasFor("value") String transactionManager() default ""; Propagation propagation() default Propagation.REQUIRED; Isolation isolation() default Isolation.DEFAULT; int timeout() default -1; boolean readOnly() default false; Class<? extends Throwable>[] rollbackFor() default {}; String[] rollbackForClassName() default {}; Class<? extends Throwable>[] noRollbackFor() default {}; String[] noRollbackForClassName() default {}; }
属性 作用 value propagation 设置事务的传播行为,默认为Propagation.REQUIRED isolation 设置事务的隔离程度,默认为Isolation.DEFAULT timeout 设置事务超时时间,默认为-1 readOnly 设置是否为只读事务,默认为false rollbackFor 设置事务回滚异常【参数为xxx.class】 rollbackForClassName 设置事务回滚异常【参数为"xxx.class"】 noRollbackFor 设置事务不回滚异常【参数为xxx.class】 noRollbackForClassName 设置事务不回滚异常【参数为"xxx.class"】 -
注意:Spring事务异常回滚仅在捕获运行时异常以及error时回滚!也可以通过rollbackFor属性指定某种异常也会回滚;
4.2 事务属性的使用场景
-
前提:
@Transactional
注解只有应用到public方法,才能进行事务管理! -
设置只读事务
@Transactional(readOnly = true) public void transfer(String out, String in, Double money);
-
设置事务超时时间(单位:秒)
@Transactional(readOnly = true, timeout = 5) public void transfer(String out, String in, Double money);
-
设置捕捉到某种指定异常也进行事务回滚
@Transactional(readOnly = true, timeout = 10, rollbackFor = IOException.class) public void transfer(String out, String in, Double money);
@Transactional(readOnly = true, timeout = 10, rollbackForClassName = "IOException.class") public void transfer(String out, String in, Double money);
-
设置事务传播行为: