2

我有以下 Grails 控制器操作:

def index() {
   def facebookUser = FacebookUser.findByUid(facebookUserId, [lock: true])
   facebookContext.user.exchangeToken()    

   FacebookUser.withTransaction {
     facebookUser.lock()
     facebookUser.accessToken = accessToken
     facebookUser.accessTokenExpires = new Date(facebookContext.user.tokenExpirationTime)
     facebookUser.save(flush: true, failOnError: true)
   } // end withTransaction

}

有时我会收到以下错误:

org.hibernate.StaleObjectStateException
Message
Executing action [success] of controller [test.FacebookController] caused exception: Runtime error executing action 
Caused by
Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [test.FacebookUser#180]

Caused by HibernateOptimisticLockingFailureException: Object of class [test.FacebookUser] with identifier [180]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [test.FacebookUser#180]
->>  683 | convertHibernateAccessException in org.springframework.orm.hibernate3.SessionFactoryUtils
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
|    412 | convertHibernateAccessException in org.springframework.orm.hibernate3.HibernateAccessor
|    411 | doExecute . . . . . . . . . . . in org.springframework.orm.hibernate3.HibernateTemplate
|    374 | executeWithNativeSession        in     ''
|    663 | lock . . . . . . . . . . . . .  in     ''
|     -1 | call                            in org.springframework.orm.hibernate3.HibernateOperations$lock
|    864 | lock . . . . . . . . . . . . .  in org.codehaus.groovy.grails.orm.hibernate.HibernateGormInstanceApi
|     -1 | lock                            in test.FacebookUser
|    419 | doCall . . . . . . . . . . . .  in test.FacebookController$_success_closure5
|     -1 | invoke                          in sun.reflect.GeneratedMethodAccessor2580
|     43 | invoke . . . . . . . . . . . .  in sun.reflect.DelegatingMethodAccessorImpl
|    606 | invoke                          in java.lang.reflect.Method
|     90 | invoke . . . . . . . . . . . .  in org.codehaus.groovy.reflection.CachedMethod
|    233 | doMethodInvoke                  in groovy.lang.MetaMethod
|   1085 | invokeMethod . . . . . . . . .  in groovy.lang.MetaClassImpl
|   1110 | invokeMethod                    in groovy.lang.ExpandoMetaClass
|    909 | invokeMethod . . . . . . . . .  in groovy.lang.MetaClassImpl
|    411 | call                            in groovy.lang.Closure
|     51 | invokeCustom . . . . . . . . .  in org.codehaus.groovy.runtime.ConvertedClosure
|     82 | invoke                          in org.codehaus.groovy.runtime.ConversionHandler
|     -1 | doInTransaction . . . . . . . . in com.sun.proxy.$Proxy57
|    130 | execute                         in org.springframework.transaction.support.TransactionTemplate
|     -1 | invoke . . . . . . . . . . . .  in sun.reflect.GeneratedMethodAccessor1546
|     43 | invoke                          in sun.reflect.DelegatingMethodAccessorImpl
|    606 | invoke . . . . . . . . . . . .  in java.lang.reflect.Method
|    189 | invoke                          in org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoCachedMethodSite
|     53 | call . . . . . . . . . . . . .  in org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite
|    116 | call                            in org.codehaus.groovy.runtime.callsite.AbstractCallSite
|    687 | withTransaction . . . . . . . . in org.grails.datastore.gorm.GormStaticApi
|     -1 | withTransaction                 in test.FacebookUser
|    418 | success . . . . . . . . . . . . in test.FacebookController
...

我从这样的答案中知道错误:行已被另一个事务更新或删除(或未保存的值映射不正确),我必须使用您可以使用悲观锁定,这是我做过两次的事情。

在我的情况下,我该怎么做才能防止出现此错误?

4

0 回答 0