分布式服务-DUBBOX(八):单一服务下事务配置

ⅰ亾dé卋堺 提交于 2019-12-05 06:07:11

1、概述

    工程调用流程:服务生产者=>Service层=>Dao层。

    在“消费层”只进行“单一”服务调用时,可暂时不用考虑“分布式”事务问题。此情形下事务还是使用Spring注解事务,只要考虑事务是配置在“服务生产者”还是“Service层”。

 

2、事务配置Service层测试

0)controller层:UserController

    @RequestMapping("addUser")
    @ResponseBody
    public Boolean addUser(String name,@DateTimeFormat(pattern = "yyyy-MM-dd") Date birthday) throws Exception{
        if(StringUtils.isEmpty(name))
            throw new DemoException("前置参数name为空");

        return userApi.add(name,birthday);
    }

1)dubbo接口:UserApi.java

    Boolean add(String name,Date birthday) throws Exception;

2)dubbo接口实现-服务生产者:UserApiImpl.java

  //@Transactional(rollbackFor = Exception.class)
    @Override
    public Boolean add(String name, Date birthday) throws Exception {
        try {
            User user = new User();
            user.setName(name);
            user.setBirthday(birthday);
            return userService.add(user);
        }catch (DemoException e){
            LOGGER.error("添加用户异常",e);
            throw new Exception("添加用户异常",e);
        }

    }

3)Service层:UserService.java

@Transactional(rollbackFor = DemoException.class)
    public Boolean add(User user) throws DemoException{
        int count = userDao.add(user);

        if(count != 1){
            throw new DemoException("数据库更新不为1");
        }

        LOGGER.info("新增user主键id=>{}",user.getId());

        if(1 == 1) {
            throw new DemoException("测试事务事务是否回滚");
        }
        return true;
    }

说明:注解事务中回滚默认是RuntimeException,DemoException并非RuntimeException,所以需要在rollbackFor 。

4)测试结果

http://localhost:8086/demo-consumer/user/addUser.do?name=wsy&birthday=2011-11-11

页面显示如下:

数据库表无对应记录

即事务配置生效,数据回滚。

 

3、事务配置在服务生产者

把UserApiImpl.java中注解事务放开,注释UserService中事务配置。

测试结果:即事务配置生效,数据回滚。

 

补充说明:在有些dubbo版本中,如果事务配置在服务生产者,会有各种问题出现。

工程中dubbo版本是从https://github.com/dangdangdotcom/dubbox下载源码重新编译,已没此问题。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!