1

ファイルの長いリストをmysqlに追加し、GrailsでSpringACLサービスを使用してアクセス許可を添付しようとしています。だから、私のコントローラーには:

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
    }

ランダムに、次のデッドロック(オプトミスティック?)エラーが発生します:

ロックを取得しようとしたときにデッドロックが見つかりました。トランザクションを再開してみてください。スタックトレースは次のとおりです。com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException:ロックを取得しようとしたときにデッドロックが見つかりました。com.mysql.jdbc.Util.handleNewInstance(Util.java:406)at com.mysql.jdbc.Util.getInstance(Util.java:381)at com.mysql.jdbc.SQLError.createSQLException(SQLError。 java:1045)at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3558)at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO .java:3490)at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1959)at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2109)at 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 に答える