基于注解的声明式事务控制

本文最后更新于:2 年前

使用注解配置声明式事务控制

1. 改用注解编写 AccoutDao

1
2
3
4
5
6
7
8
9
10
11
12
13
@Repository("accountDao")
public class AccountDaoImpl implements AccountDao {

@Autowired
private JdbcTemplate jdbcTemplate;

@Override
public void out(String outMan, double money) { jdbcTemplate.update("update account set money=money-? where name=?", money, outMan); }

@Override
public void in(String inMan, double money) { jdbcTemplate.update("update account set money=money+? where name=?", money, inMan); }

}

2. 改用注解编写 AccoutService

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Service("accountService")
public class AccountServiceImpl implements AccountService {

@Autowired
private AccountDao accountDao;

@Override
@Transactional(isolation = Isolation.READ_COMMITTED,propagation = Propagation.REQUIRED)
public void transfer(String outMan, String inMan, double money) {
accountDao.out(outMan,money);
int i = 1 / 0;
accountDao.in(inMan,money);
}

@Transactional(isolation = Isolation.DEFAULT)
public void xxx(){};
}

3. 编写 applicationContext.xml 配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<!--组件扫描-->
<context:component-scan base-package="cc.gaojie"/>

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"/>
<property name="user" value="root"/>
<property name="password" value="778874315"/>
</bean>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>

<!--平台事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>

<!--事务的注解驱动-->
<tx:annotation-driven transaction-manager="transactionManager"/>

4. 测试

数据库无任何更新,说明异常前后的事务都被控制住了。

注解配置声明式事务控制解析

  • 使用 @Transactional 在需要进行事务控制的类或是方法上修饰,注解可用的属性同 xml 配置方式,例如隔离级别、传播行为等。
  • 注解使用在类上,那么该类下的所有方法都使用同一套注解参数配置。
  • 使用在方法上,不同的方法可以采用不同的事务参数配置。
  • Xml配置文件中要开启事务的注解驱动 <tx:annotation-driven />

知识要点

  • 平台事务管理器配置(xml方式)
  • 事务通知的配置(@Transactional注解配置)
  • 事务注解驱动的配置 <tx:annotation-driven/>

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!