SSM 学习第四天

Spring 事务管理

具体步骤

案例描述, 银行两个账户, 一个账户向另一个账户转钱, 需要进行事务管理
Spring 事务管理分为三个步骤

  • 在业务层接口上使用 @Transactional 开启事务管理
    1
    2
    3
    4
    public interface AccountService {
    @Transactional
    void method(String addAccount, String subAccount, Integer money);
    }
  1. 注解加在接口而不是实现类上, 目的是为了降低耦合
  2. 可以加在方法上, 也可以加在类上
  • 设置事务管理器

在配置类中

1
2
3
4
5
6
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
DataSourceTransactionManager dt = new DataSourceTransactionManager();
dt.setDataSource(dataSource);
return dt;
}
  • 开启注解式事务管理驱动

在 SpringConfig 配置文件中

1
@EnableTransactionManagement

入门案例

  • 项目结构
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    .
    ├── pom.xml
    ├── src
    │   └── main
    │   ├── java
    │   │   └── com
    │   │   └── ljguo
    │   │   ├── AppTest.java
    │   │   ├── config
    │   │   │   ├── JdbcConfig.java
    │   │   │   ├── MybatisConfig.java
    │   │   │   └── SpringConfig.java
    │   │   ├── mapper
    │   │   │   └── AccountMapper.java
    │   │   ├── pojo
    │   │   │   └── Account.java
    │   │   └── service
    │   │   ├── AccountService.java
    │   │   └── impl
    │   │   └── AccountServiceImpl.java
    │   └── resources
    │   ├── com
    │   │   └── ljguo
    │   │   └── mapper
    │   │   └── AccountMapper.xml
    │   └── jdbc.properties
    └── transaction.iml

    14 directories, 13 files
    源码仓库地址 transaction

事务角色

  • 事务管理员: 发起事务方, 在 Spring 中通常指代业务层开启事务的方法
  • 事务协调员: 加入事务方, 在 Spring 中通常指代数据层方法, 也可以是业务层方法

每个事务协调员(数据层方法等)的使用就会创建一个事务, 如何加入到事务管理员(发起事务方), 然后变成一个事务, 这样就实现了事务统一管理

事务属性

并不是遇到所有异常事务都会回滚, 只有遇到 Error, 或者运行时异常才会进行事务回滚

这时需要在 @Transactional 加入参数

1
2
3
4
public interface AccountService {
@Transactional(rollbackFor = {IOException.class})
void method(String addAccount, String subAccount, Integer money);
}

通过 rollbackFor 接收参数数组, 然后实现事务回滚

事务传播行为

待补充