这里启动三个项目,一个发起方,也就是我们常说的消费者,二个参与方,也就是我们常说的提供者,数据库的处理方式采用jpa的方式,这个用mybatis,hibernate都不影响。
项目结构如下:
具体的搭建的方式这里就不讲解,这里先把hystrix给去掉,下一篇讲解存在hystrix的情况,采用一个简单的例子,这边要创建用户并且要给这个用户赋予相应的权限。
vts_sc_lcn_jpa : 消费者,事物发起方
vts_sc_lcn_jpa1:权限管理,提供者,事物参与方,时间原因,这里就没有对其实现。
vts_sc_lcn_jpa2:角色管理,提供者,事物参与方
vts_sc_lcn_jpa3:用户管理,提供者,事物参与方
vts_sc_lcn_jpa发起创建用户的需求,代码,如下,这里故意吧pkUser设置为空,让后面的业务参数异常。
@Autowired
private RoleService roleService;
@Autowired
private UserService userService;
@Override
@TxTransaction(isStart = true)
@Transactional
public String createUser(String pkRole,List<String> pkAuth) {
// TODO Auto-generated method stub
String pkUser = userService.createUser();
System.out.println(pkUser);
pkUser = null;
roleService.bindRole(pkRole, pkUser);
return "调用成功";
}
vts_sc_lcn_jpa2:事物参与方,提供创建用户,代码如下:
/**
* 注入用户数据Dao
*/
@Autowired
private VTSUserDao vtsUserDao;
@Override
@Transactional
@TxTransaction
public String createUser() {
// TODO Auto-generated method stub
VTS_User vts_User = new VTS_User();
vts_User.setUserCode("大仙");
vts_User.setUserName("大仙");
vtsUserDao.save(vts_User);
return "保存成功";
}
vts_sc_lcn_jpa3:事物参与方,提供绑定角色,代码如下:
@Override
@Transactional
@TxTransaction
public String bindRole(String pkRole, String pkUser) {
// TODO Auto-generated method stub
if(pkUser==null){
throw new RuntimeException("绑定角色错误");
}
return "绑定成功";
}
我们这里加了个判断,如果用户是空,直接抛出异常。
启动三个应用,访问相应的请求路径。
发起方抛出如下异常:
查询数据库,用户是否插入:
数据库无相应的数据,事物管理成功,我们可以看到异常是vts_sc_lcn_jpa3发出,但是vts_sc_lcn_jpa2的数据也相应的回滚了。