分佈式服務-DUBBOX(八):單一服務下事務配置

一、概述

    工程調用流程:服務生產者=>Service層=>Dao層。java

    在「消費層」只進行「單一」服務調用時,可暫時不用考慮「分佈式」事務問題。此情形下事務仍是使用Spring註解事務,只要考慮事務是配置在「服務生產者」仍是「Service層」。git

 

二、事務配置Service層測試

0)controller層:UserControllergithub

@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.javaapp

//@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 。ide

4)測試結果測試

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

頁面顯示以下:code

數據庫表無對應記錄

即事務配置生效,數據回滾。

 

三、事務配置在服務生產者

把UserApiImpl.java中註解事務放開,註釋UserService中事務配置。

測試結果:即事務配置生效,數據回滾。

 

補充說明:在有些dubbo版本中,若是事務配置在服務生產者,會有各類問題出現。

工程中dubbo版本是從https://github.com/dangdangdotcom/dubbox下載源碼從新編譯,已沒此問題。

相關文章
相關標籤/搜索