使用注解配置声明式事务控制
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/>