我开始在我的日志中看到“无法将数据库状态与会话同步”异常,并且我很难再现它。有时它工作正常......我看到两个例外(它们发生在不同的时间):
错误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)
}
}
我整天都在这里,我真的很感激任何帮助。
答案 0 :(得分:4)
这里的答案是使用lock:true。
School.findByName(name, [lock: true])
答案 1 :(得分:1)
尝试:
User.withTransaction {
...
user.save(flush:true)
sessionFactory.currentSession.flush()
sessionFactory.currentSession.clear()
}