2012-06-27 23 views
7

Tôi bắt đầu thấy "Không thể đồng bộ hóa trạng thái cơ sở dữ liệu với phiên" ngoại lệ trong nhật ký của tôi và tôi đang gặp khó khăn khi tái tạo. Đôi khi nó hoạt động tốt ... Tôi thấy hai trường hợp ngoại lệ (chúng đang xảy ra vào những thời điểm khác nhau):Unpredictable "Không thể đồng bộ hóa trạng thái cơ sở dữ liệu với phiên" ngoại lệ trong grails

ERROR JDBCExceptionReporter - Tìm thấy khóa khi cố gắng khóa; thử khởi động lại LỖI giao dịch PatchedDefaultFlushEventListener - Không thể đồng bộ hóa cơ sở dữ liệu trạng thái với phiên org.hibernate.exception.LockAcquisitionException: không thể cập nhật: [com.myapp.School # 1911]

ERROR PatchedDefaultFlushEventListener - Không thể đồng bộ hóa trạng thái cơ sở dữ liệu với phiên org.hibernate.StaleObjectStateException: Hàng được cập nhật hoặc xóa bởi một giao dịch khác (hoặc chưa lưu giá trị m apping không chính xác): [com.myapp.School # 1905]

Dưới đây là phương pháp mà họ đang ném:

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) 
    } 
} 

Tôi đã ở đây cả ngày và tôi thực sự muốn đánh giá cao bất kỳ sự giúp đỡ nào.

+0

Bạn có thể đăng toàn bộ miền của mình tại đây - 2) tại sao bạn đang dùng user = user.merge (flush: true) –

+0

Bạn đã thử user.refresh() chưa? Khi tôi gặp một số hành vi khó xử, tôi thường tham khảo bài đăng này: http://stackoverflow.com/questions/536601/what-are-your-favorite-grails-debugging-tricks hoặc để chính xác hơn, câu trả lời với một lần thử lưu . – marko

+1

Nhưng anh ta nên thực sự cố gắng tìm ra lý do tại sao điều này xảy ra và nguồn gốc của vấn đề là gì, tôi sẽ không giải quyết cho đến khi tôi biết tại sao điều này lại xảy ra ngay từ đầu. –

Trả lời

4

Câu trả lời ở đây là sử dụng khóa: true.

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

Hãy thử với:

User.withTransaction { 
    ... 
    user.save(flush:true) 
    sessionFactory.currentSession.flush() 
    sessionFactory.currentSession.clear() 
} 
Các vấn đề liên quan