獲取數據 query.setLockMode 對查詢語句中特定別名所對應的記錄進行加鎖(我們為 TUser類指定了一個別名“user”),這里也就是對返回的所有user記錄進行加鎖。 觀察運行期Hibernate生成的SQL語句:
這里Hibernate通過使用數據庫的for update子句實現了悲觀鎖機制。 上面這兩種鎖機制是我們在應用層較為常用的,加鎖一般通過以下方法實現: Criteria.setLockMode Query.setLockMode Session.lock 注意,只有在查詢開始之前(也就是Hiberate 生成SQL 之前)設定加鎖,才會 真正通過數據庫的鎖機制進行加鎖處理,否則,數據已經通過不包含for update 子句的Select SQL加載進來,所謂數據庫加鎖也就無從談起。
注意version 節點必須出現在ID 節點之后。 這里我們聲明了一個version屬性,用于存放用戶的版本信息,保存在TUser表的 version字段中。 此時如果我們嘗試編寫一段代碼,更新TUser表中記錄數據,如: 代碼內容
每次對TUser進行更新的時候,我們可以發現,數據庫中的version都在遞增。 而如果我們嘗試在tx.commit 之前,啟動另外一個Session,對名為Erica 的用 戶進行操作,以模擬并發更新時的情形: 代碼內容
執行以上代碼,代碼將在tx.commit()處拋出StaleObjectStateException異 常,并指出版本檢查失敗,當前事務正在試圖提交一個過期數據。通過捕捉這個異常,我 們就可以在樂觀鎖校驗失敗時進行相應處理。