spring 事务传播行为之嵌套事务NESTED细节


	spring 事务传播行为之嵌套事务NESTED细节
[编程语言教程]

照抄自:https://www.jianshu.com/p/c6d4095f5833

spring 事务传播行为之嵌套事务NESTED细节

经过我之前的实践,可以看出 NESTED事务申明在调用者上会新建一个独立事务。申明在被调用者上,若调用者存在事务则加入调用者事务。调用者不存在事务则新建一个独立事务。

这个功能好像和spring默认的事务传播行为REQUIRED一样的?
不,它的功能可是比REQUIRED要强大!

我来通过实验证明NESTED和REQUIRED的区别

这个例子是基于 https://www.jianshu.com/p/bc3cbacf9e70 这个文章的代码

首先,InsertUsers和InsertCuser方法上都申明了REQUIRED,让他们属于同一个事务。将引发异常的语句 int i = 1/0; 放到 InsertCuser方法里

    @Transactional(propagation = Propagation.REQUIRED)
    @Override
    public void InsertUsers(Users users) {
        jdbcTemplate.update("INSERT INTO users(id,name, age, email) VALUES (?, ?, ?, ?);", users.getId(), users.getName(), users.getAge(), users.getEmail());
        //调用service中另一个方法
        Cuser cuser = new Cuser(users.getId(), users.getName(), users.getAge(), users.getEmail());
        //打印事务名
        List<Map<String, Object>> maps = jdbcTemplate.queryForList("SELECT TRX_ID FROM INFORMATION_SCHEMA.INNODB_TRX WHERE TRX_MYSQL_THREAD_ID = CONNECTION_ID( );");
        System.out.println(maps + TransactionSynchronizationManager.getCurrentTransactionName());
        //对InsertCuser抛出的异常进行捕获处理,并且不再向上抛出
        try {
            cuserService.InsertCuser(cuser);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » spring 事务传播行为之嵌套事务NESTED细节