Spring声明式事务

代码实例

上下文配置类上加上@EnableTransactionManagement注解

@Configuration
@EnableTransactionManagement
public class RootConfig {
}

注册DataSourceTransactionManager

@Bean  
public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource) {  
    DataSourceTransactionManager manager = new DataSourceTransactionManager();  
    manager.setDataSource(dataSource);  
    return manager;  
}

在这个上下文中定义的其它bean即可使用声明式事务

@Transactional  
public void insertUser(User user) throws UsernameDuplicatedException {  
    if(this.validateUsernameDuplicated(user.getUsername())) {  
        userMapper.insertUserBasicInfo(user);  
        userMapper.insertUserAuthority(user.getId(), user.getAuthority());  
    } else {  
        throw new UsernameDuplicatedException("Username : [" + user.getUsername() + "] has existed in database.");  
    }  
}

事务生效条件

由于声明式事务是通过动态代理实现的,注解@Transactional必须加在public方法上,并且必须是别的对象调用该对象的这个public方法,事务才生效