编程式事务和声明式事务

2019-01-21  本文已影响10人  yinhaijun

本篇文章承接《springboot的mybatis示例》

编程式事务

编程式事务是代码级别的,类似于JDBC的事务管理,Spring管理使用TransactionTemplate事务
1.配置事务模板

    /**
     * 数据源加入事务管理
     * @param masterDataSource
     * @return
     */
    @Bean(name = "transactionManager")
    @Primary
    public DataSourceTransactionManager masterDataSourceTransactionManager(@Qualifier("masterDataSource") DataSource masterDataSource){
        final DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
        dataSourceTransactionManager.setDataSource(masterDataSource);
        return dataSourceTransactionManager;
    }

 /**
     * 事务管理加入事务模板
     * @param transactionManager
     * @return
     */
    @Bean(name = "transactionTemplate")
    @Primary
    public TransactionTemplate masteerTransactionTemplate(@Qualifier("transactionManager") DataSourceTransactionManager transactionManager){
        final TransactionTemplate transactionTemplate = new TransactionTemplate();
        transactionTemplate.setTransactionManager(transactionManager);
        transactionTemplate.setIsolationLevelName("ISOLATION_DEFAULT");
        transactionTemplate.setPropagationBehaviorName("PROPAGATION_REQUIRED");
        return transactionTemplate;
    }

2.使用

    @Autowired
    private TransactionTemplate transactionTemplate;
  @Override
    public void addUsers(List<User> users){
        TransactionCallback transactionCallback = new TransactionCallback() {
            @Nullable
            @Override
            public Object doInTransaction(TransactionStatus status) {
                try {
                    for (User user : users) {
                        int i = userMapper.insert(user);
                        if (i == 1) {
                            System.out.println("添加成功");
                        } else {
                            System.out.println("添加失败");
                        }
                    }
                }catch (Exception e){
                    e.printStackTrace();
                    System.out.println("出现异常,回滚");
                    //设置事务回滚
                    status.setRollbackOnly();
                }
                return null;
            }
        };
        transactionTemplate.execute(transactionCallback);
    }

3.测试,先把user的name加上唯一索引

ALTER TABLE `user` ADD UNIQUE ( `name` ) ;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = SpringbootdemoMybatisApplication.class)
@WebAppConfiguration
public class SpringbootdemoMybatisApplicationTests {

    @Resource
    UserService myUserService;

    @Test
    public void testUser() throws Exception {
        List<User> users = new ArrayList<>();
        User user1 = new User();
        user1.setAge(11);
        user1.setName("明明4");
        user1.setSocialPriceAmount(new BigDecimal(1000));
        user1.setUserLevel(UserLevelEnum.LEVEL_1);
        user1.setCreatedTime(new Date());
        user1.setUpdateTime(new Date());
        User user2 = new User();
        user2.setAge(22);
        user2.setName("欢欢");
        user2.setSocialPriceAmount(new BigDecimal(12000));
        user2.setUserLevel(UserLevelEnum.LEVEL_2);
        user2.setCreatedTime(new Date());
        user2.setUpdateTime(new Date());
        users.add(user1);
        users.add(user2);
        myUserService.addUsers(users);
    }

}

4.结果
由于数据库中name属性有唯一索引,索引该demo中两条数据都不会添加成功

声明式事务

管理建立在AOP基础上,本质是对方法前后进行拦截,所以声明式事务是方法级别的,使用的时候只需要在方法前面加上@Transactional注解
1.使用,不需要做其他配置了

 @Transactional(rollbackFor = Exception.class)
    @Override
    public void addUsers(List<User> users){
        for (User user : users) {
            int i = userMapper.insert(user);
            if (i == 1) {
                System.out.println("添加成功");
            } else {
                System.out.println("添加失败");
            }
        }
    }

2.测试,同上
3.结果,同上

上一篇 下一篇

猜你喜欢

热点阅读