在休息控制器中使用两个服务操作实现事务完整性
Achieving transactional integrity using two service operations in a rest controller
我对使用 Java/Jakarta EE 和 JAX-RS 的 REST-Controllers 中的事务边界有疑问。
给定以下控制器,当在 @POST
方法中创建用户时,首先使用专用服务创建用户。之后,使用不同的服务存储用户的权限。
两种服务都将传入调用包装在容器管理的事务中。
@Path("/users")
public class UserController {
@Inject
private UserService userService;
@Inject
private PermissionService permissionService;
@POST
public UserDto createUser(UserDto userDto) {
User user = mapToUser(userDto);
User createdUser = userService.create(user);
Permissions perms = mapToPermissions(userDto);
permissionService.createPermissions(createdUser.getId());
return mapToUserDto(createdUser);
}
}
在我看来,userService.create()
周围存在一个交易边界,permissionService.createPermissions()
周围存在第二个边界。你能证实这是真的吗?
其次,如果前面的陈述属实,并且应用程序在处理过程中关闭,则可能不会保留用户权限。这种方法是否被认为是不好的做法,是否应该在单个事务中执行这两个操作(或在不同资源/端点下的 REST 范例中)?
你是对的,有两个事务,所以第一个可以成功,第二个失败。
一种常见的做法是使用服务外观模式。设置事务边界并调用服务以实现结果的粗粒度服务。
我对使用 Java/Jakarta EE 和 JAX-RS 的 REST-Controllers 中的事务边界有疑问。
给定以下控制器,当在 @POST
方法中创建用户时,首先使用专用服务创建用户。之后,使用不同的服务存储用户的权限。
两种服务都将传入调用包装在容器管理的事务中。
@Path("/users")
public class UserController {
@Inject
private UserService userService;
@Inject
private PermissionService permissionService;
@POST
public UserDto createUser(UserDto userDto) {
User user = mapToUser(userDto);
User createdUser = userService.create(user);
Permissions perms = mapToPermissions(userDto);
permissionService.createPermissions(createdUser.getId());
return mapToUserDto(createdUser);
}
}
在我看来,userService.create()
周围存在一个交易边界,permissionService.createPermissions()
周围存在第二个边界。你能证实这是真的吗?
其次,如果前面的陈述属实,并且应用程序在处理过程中关闭,则可能不会保留用户权限。这种方法是否被认为是不好的做法,是否应该在单个事务中执行这两个操作(或在不同资源/端点下的 REST 范例中)?
你是对的,有两个事务,所以第一个可以成功,第二个失败。
一种常见的做法是使用服务外观模式。设置事务边界并调用服务以实现结果的粗粒度服务。