簡體   English   中英

Grails:樂觀鎖定,StaleObjectStateException與Spring Security會話中的域,更新計數器

[英]Grails: Optimistic locking, StaleObjectStateException with domain on session with Spring Security, updating counters

我有一個Grails應用程序,人們可以在其中通過Spring Security登錄。 然后,在登錄期間,將其用戶域加載到會話上。

當另一個用戶執行一個操作來更新數據庫user.save(flush:true)中當前在登錄用戶的另一個會話上的用戶對象上的計數器時,出現user.save(flush:true)

例如,我在會話中具有用於登錄用戶A的“用戶A”對象。然后,當用戶B登錄時,執行一個操作來更新用戶A對象,但版本不同步。

org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.example.User#2]

        at $Proxy12.merge(Unknown Source) 

我嘗試合並,但沒有運氣。

我正在考慮完全刪除“版本”屬性,因為用戶域上的更新如此之多,將導致數百名用戶登錄。但是我不知道這會對數據一致性產生什么影響時間。

user.save(flush:true)交換到User.executeUpdate(Update viewCount where ...)解決問題並帶來更多的緩存問題嗎?

或者我可以選擇在更新它們時可以忽略“版本”的特定屬性。 我對這個例子不太了解。 http://grails.1312388.n4.nabble.com/GORM-setting-access-field-td1592837.html

那么我該如何解決呢?

解決:基本上在會話中沒有用戶域。 只是用戶ID。 因此,您可以在需要使用域時加載它。

解決方案是不要在會話內部使用域對象。 改用id,然后為需要用戶數據的每個請求加載對象。 它是針對grails的spring安全插件中引入的差異。 有關更多信息,請在此處查看(官方文檔):

http://burtbeckwith.github.com/grails-spring-security-core/docs/manual/guide/2%20Differences%20Between%20the%20Spring%20Security%20and%20Acegi%20Plugins.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM