grails服务使用mysql进行死锁

时间:2020-12-05 06:50:53

I'm trying to add a long list of file into mysql and use spring ACL service with grails to attach permission. So, in my controller i have:

我正在尝试将一长串文件添加到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)
        }

the i have no worries with the Files domain object, it supports huge amount of data ,(specially since i 've disabled versioning in mysql), the problem is on filesService which uses aclUtilService,

我不用担心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
    }

Randomly i have the following deadlock (optmistic?)error :

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

Deadlock found when trying to get lock; try restarting transaction. Stacktrace follows: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction at 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) at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2077) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2362) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2280) at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2265) at org.grails.plugins.springsecurity.service.acl.AclService.save(AclService.groovy:330) at org.grails.plugins.springsecurity.service.acl.AclService.createEntries(AclService.groovy:198) at org.grails.plugins.springsecurity.service.acl.AclService.updateAcl(AclService.groovy:176) at GrailsMelodyGrailsPlugin$_closure5_closure18_closure19.doCall(GrailsMelodyGrailsPlugin.groovy:170) at org.grails.plugins.springsecurity.service.acl.AclUtilService.addPermission(AclUtilService.groovy:90) at org.grails.plugins.springsecurity.service.acl.AclUtilService.addPermission(AclUtilService.groovy:67) at GrailsMelodyGrailsPlugin$_closure5_closure18_closure19.doCall(GrailsMelodyGrailsPlugin.groovy:170) at xxxxxxxxxxxxx.FilesService.addPermission(FilesService.groovy:34) at GrailsMelodyGrailsPlugin$_closure5_closure18_closure19.doCall(GrailsMelodyGrailsPlugin.groovy:170) at xxxxxxxxxxxxxQuantumController$_uploadToS3_closure1$$ENzPdDAW.doCall(QuantumController.groovy:87) at org.grails.datastore.gorm.GormStaticApi.withTransaction(GormStaticApi.groovy:686) at xxxxxxxxxxxxx.QuantumController$$ENzPdDAW.uploadToS3(QuantumController.groovy:84) at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:195) at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63) at net.bull.javamelody.JspWrapper.invoke(JspWrapper.java:149) at net.bull.javamelody.JdbcWrapper$DelegatingInvocationHandler.invoke(JdbcWrapper.java:259) at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:202) at net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:175) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918) at java.lang.Thread.run(Thread.java:680)

试图锁定时发现死锁;尝试重新启动事务。 Stacktrace如下:com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException:尝试获取锁定时发现死锁;尝试通过com.mysql.jdbc.SQLError.createSQLException(即SQLError)在com.mysql.jdbc.Util.getInstance(Util.java:381)的com.mysql.jdbc.Util.handleNewInstance(Util.java:406)重新启动事务。的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.executeInternal(PreparedStatement.java:2077)在com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2362)在com.mysql.jdbc.PreparedStatement.executeUpdate (PreparedStatement.java:2280)com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2265)atg.grails.plugins.springsecurity.service.acl.AclService.save(AclService.groovy:330)at org。 grails.plugins。 springsecurity.service.acl.AclService.createEntries(AclService.groovy:198)位于orils.grails.plugins.springsecurity.service.acl.AclService.updateAcl(AclService.groovy:176)GrailsMelodyGrailsPlugin $ _closure5_closure18_closure19.doCall(GrailsMelodyGrailsPlugin.groovy: 170)在org.grails.plugins.springsecurity.service.acl.AclUtilService.addPermission(AclUtilService.groovy:90)在org.grails.plugins.springsecurity.service.acl.AclUtilService.addPermission(AclUtilService.groovy:67)在GrailsMelodyGrailsPlugin $ _closure5_closure18_closure19.doCall(GrailsMelodyGrailsPlugin.groovy:170)at xxxxxxxxxxxxx.FilesService.addPermission(FilesService.groovy:34)at GrailsMelodyGrailsPlugin $ _closure5_closure18_closure19.doCall(GrailsMelodyGrailsPlugin.groovy:170)at xxxxxxxxxxxxxQuantumController $ _uploadToS3_closure1 $$ ENzPdDAW.doCall(QuantumController.groovy :87)org.grails.datastore.gorm.GormStaticApi.withTransaction(GormStaticApi.groovy:686)位于xxxxxxxxxxxxx.QuantumController $$ ENzPdDAW.uploadToS3(QuantumC ontroller.groovy:84)在grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:195)在grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)在净.bull.javamelody.JspWrapper.invoke(JspWrapper.java:149)在net.bull.javamelody.JdbcWrapper $ DelegatingInvocationHandler.invoke(JdbcWrapper.java:259)在net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:202 )在net.bull.javamelody.MonitoringFilter.doFilter(MonitoringFilter.java:175)在java.util.concurrent.ThreadPoolExecutor中的$ Worker.runTask(ThreadPoolExecutor.java:895)在java.util.concurrent.ThreadPoolExecutor中的$ Worker.run( ThreadPoolExecutor.java:918)at java.lang.Thread.run(Thread.java:680)

Any help please ?

有什么帮助吗?

1 个解决方案

#1


0  

just encapsulated the transaction in controller and use @Transactional in the service to solve the issue:

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

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

...}
}

#1


0  

just encapsulated the transaction in controller and use @Transactional in the service to solve the issue:

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

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

...}
}