在休息控制器中使用两个服务操作实现事务完整性

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 范例中)?

你是对的,有两个事务,所以第一个可以成功,第二个失败。

一种常见的做法是使用服务外观模式。设置事务边界并调用服务以实现结果的粗粒度服务。