grails中不可预测的“无法同步数据库状态与会话”异常

时间:2012-06-27 02:22:53

标签: grails gorm

我开始在我的日志中看到“无法将数据库状态与会话同步”异常,并且我很难再现它。有时它工作正常......我看到两个例外(它们发生在不同的时间):

  

错误JDBCExceptionReporter - 尝试获取锁定时发现死锁;   尝试重新启动事务ERROR PatchedDefaultFlushEventListener -   无法将数据库状态与会话同步   org.hibernate.exception.LockAcquisitionException:无法更新:   [com.myapp.School#1911]

  

错误PatchedDefaultFlushEventListener - 无法同步   会话org.hibernate.StaleObjectStateException的数据库状态:   行已被另一个事务(或未保存的值)更新或删除   映射不正确):[com.myapp.School#1905]

以下是抛出它们的方法:

def populateFriends(ArrayList<FriendView> friends, User user) {

    friends.eachWithIndex { friendView, index ->

        def friend = Friend.findByFriendId(friendView.id) ?: new Friend()
        def schoolName = friendView.schoolName
        def school = null
        if (schoolName) {
            school = School.findByName(schoolName) ?: new School(name: schoolName).save(flush:true)
        }
        if (school) {
            // add to user's school list
            user = User.get(user.id)
            user.addToSchools(school)
            user = user.merge(flush: true)
            user.save(flush: true)

            friend.school = school
        }
        friend.save(flush: true)
    }
}

我整天都在这里,我真的很感激任何帮助。

2 个答案:

答案 0 :(得分:4)

这里的答案是使用lock:true。

School.findByName(name, [lock: true])

答案 1 :(得分:1)

尝试:

User.withTransaction {
    ...
    user.save(flush:true)
    sessionFactory.currentSession.flush()
    sessionFactory.currentSession.clear()
}