基于注解配置的声明式事务控制
要使用注解,就要导入xmlns:context
的名称空间,以及配置包扫描的路径<context:component-scan>
1. 配置事务管理器
与基于XML的配置相同,第一步也是配置DataSourceTransactionManager
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
2. 注解事务支持<tx:annotation-driven>
<tx:annotation-driven></tx:annotation-driven>
3. @Transaction
注解标注事务
- 标注一个类,表示这个类中的所有方法都是事务
- 标注一个方法,表示这个方法是事务
示例
要求:一个Service类中的查询方法getAll()的传播类型为SUPPORTS
;其他方法的传播类型为REQUIRED
。
@Transactional(readOnly = false, propagation = Propagation.REQUIRED)
@Service("userService")
public class UserServiceImpl {
@Autowired
private UserDaoImpl userDao;
public void setUserDao(UserDaoImpl userDao) {
this.userDao = userDao;
}
@Transactional(readOnly = true, propagation = Propagation.SUPPORTS)
public List<User> getAll(){
return userDao.getAll();
}
public void transfer(String from, String to, double money){
User fromUser = userDao.getUserByUsername(from);
User toUser = userDao.getUserByUsername(to);
fromUser.setAccount(fromUser.getAccount() - money);
toUser.setAccount(toUser.getAccount() + money);
userDao.update(fromUser);
userDao.update(toUser);
}
}