我想在SQLServer上設置JPA樂觀鎖定。爲此,我使用TIMESTAMP
列(SQLServer TIMESTAMP
是遞增的數字,不保留日期或時間)。JPA與SQLServer樂觀鎖定TIMESTAMP
正在自動遞增的數字,在我的Java實體需要設置插入/更新到false
否則我會得到一個異常:
com.microsoft.sqlserver.jdbc.SQLServerException:無法更新時間戳列
這裏是我的Java實體映射:
@Version
@Column(name = "TSROWVERSION", insertable = false, updatable = false)
private byte[] version;
當我更新記錄這個S QL執行:
(1) *SELECT ... FROM cmd_e_entities WHERE uidentity=?*
(2) *UPDATE cmd_e_entities SET... WHERE uidentity=?*
,但我期待得到的東西,如:
(3) *UPDATE cmd_e_entities SET... WHERE uidentity=? AND tsrowversion=?*
Hibernate的執行首先SELECT
檢查,如果該記錄已改變(1),然後將其更新(2) 。如果記錄被修改它拋出一個異常:
org.hibernate.StaleObjectStateException:行被更新或者通過其他交易
所以它工作正常刪除,但我期待UPDATE
考慮到說明版本(3)。實際上,如果將sql的類型從TIMESTAMP
更改爲NUMBER
並刪除可插入/可更新,它將按預期工作。
如果UPDATE
不考慮版本(... AND tsrowversion=?
)如何保證樂觀鎖定?我如何獲得預期的行爲?