1

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

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
    }

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

尝试获取锁时发现死锁;尝试重新启动事务。Stacktrace 如下: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: 尝试获取锁时发现死锁;尝试在 com.mysql.jdbc.Util.getInstance(Util.java:381) 在 com.mysql.jdbc.SQLError.createSQLException(SQLError. java:1045) 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956) 在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3558) 在 com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO .java:3490) 在 com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959) 在 com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2109) 在 com.mysql.jdbc.ConnectionImpl.execSQL( ConnectionImpl.java:2648) 在 com.mysql.jdbc.PreparedStatement。

请问有什么帮助吗?

4

1 回答 1

0

只是将事务封装在控制器中并在服务中使用@Transactional 来解决问题:

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

...}
}
于 2013-03-13T21:25:43.003 回答