工程調用流程:服務生產者=>Service層=>Dao層。java
在「消費層」只進行「單一」服務調用時,可暫時不用考慮「分佈式」事務問題。此情形下事務仍是使用Spring註解事務,只要考慮事務是配置在「服務生產者」仍是「Service層」。git
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下載源碼從新編譯,已沒此問題。