美文网首页
编程式事务和声明式事务

编程式事务和声明式事务

作者: yinhaijun | 来源:发表于2019-01-21 16:31 被阅读10次

本篇文章承接《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.结果,同上

相关文章

  • Spring事务管理机制(转载)

    Spring事务机制主要包括声明式事务和编程式事务,此处侧重讲解声明式事务,编程式事务在实际开发中得不到广泛使用,...

  • ☆Spring 事务机制详解

    Spring事务机制主要包括声明式事务和编程式事务,此处侧重讲解声明式事务,编程式事务在实际开发中得不到广泛使用,...

  • Spring事务

    基础概念 ​ Spring中事务支持编程式事务和声明式事务。编程式事务由使用者自行编码控制事务;声明式事务则是...

  • Spring事务总结

    1. 编程式事务和声明式事务 spring支持编程式事务管理和声明式事务管理两种方式。 编程式事务Spring推荐...

  • 手写系列之 —— 实现Spring事务注解功能

    Spring事务分为编程式事务和声明式事务,编程式事务是手动控制,声明式事务是利用注解或者配置文件自动实现事务控制...

  • 手写源码(一):自己实现Spring事务

    手写Spring事务 Spring事务分为声明式事务(注解或包扫描)和编程式(在代码里提交或回滚)事务,声明式事务...

  • spring事务(二) 声明式事务

    spring事务(二) 声明式事务 知识导读 声明式事务是对编程式事务的包装 声明式事务通过使用AOP来实现,注册...

  • 声明式事务

    编程式事务:1.1 由程序员编程事务控制代码.1.2 OpenSessionInView 编程式事务 声明式事务:...

  • Spring 事务机制详解

    Spring事务机制主要包括声明式事务和编程式事务 Spring声明式事务时,有一个非常重要的概念就是事务属性。事...

  • Spring事务

    Spring 事务 分类 Spring可以支持编程式事务和声明式事务。 编程式事务 实现 Spring使用事务管理...

网友评论

      本文标题:编程式事务和声明式事务

      本文链接:https://www.haomeiwen.com/subject/jepcjqtx.html