我正在尝试将一长串文件添加到mysql中,并使用带有grails的spring ACL服务来附加权限。
因此,在我的 Controller 中,我有:

Files.withTransaction {
            Files file = new Files(dataStore:ds,created:new Date(),path:target,name:fileName,contentType:contentType,contentLength:contentLength,isFolder:false).save(flush:true)
            file = Files.lock(file.id)
            filesService.addPermission(file, username ,BasePermission.ADMINISTRATION)
        }

我对Files域对象没有任何担心,它支持大量数据,(特别是因为我在mysql中禁用了版本控制),问题出在使用aclUtilService的filesService上,
@Transactional
    @PreAuthorize("hasRole('ROLE_ADMIN') or hasRole('ROLE_USER') or hasRole('ROLE_GROUP_OWNER')")
    def addPermission(Files f, String username,Permission permission) {
        aclUtilService.addPermission f,username,permission
    }

随机我有以下死锁(乐观?)错误:



有什么帮助吗?

最佳答案

只需将事务封装在 Controller 中,并在服务中使用@Transactional即可解决问题:

Files.withTransaction {
                    Files file = new Files(
...
                    if (file.validate()) {
                        file.save()
                        filesService.addPermission(file,username,BasePermission.ADMINISTRATION)

...}
}

10-08 17:10