……
注意version節點必須出現在ID節點之後。
這裡我們聲明了一個version屬性,用於存放用戶的版本信息,保存在TUser表的version欄位中。
此時如果我們嘗試編寫一段代碼,更新TUser表中記錄數據,如:
Criteriacriteria=session.createCriteria(TUser.class);
criteria.add(Expression.eq("name","Erica"));
ListuserList=criteria.list();
TUseruser=(TUser)userList.get(0);
Transactiontx=session.beginTransaction();
user.setUserType(1);//更新UserType欄位
tx.commit();
每次對TUser進行更新的時候,我們可以發現,資料庫中的version都在遞增。而如果我們嘗試在tx.commit之前,啟動另外一個Session,對名為Erica的用戶進行操作,以模擬併發更新時的情形:
Sessionsession=getSession();
Criteriacriteria=session.createCriteria(TUser.class);
criteria.add(Expression.eq("name","Erica"));
Sessionsession2=getSession();
Criteriacriteria2=session2.createCriteria(TUser.class);
criteria2.add(Expression.eq("name","Erica"));
ListuserList=criteria.list();
ListuserList2=criteria2.list();TUseruser=(TUser)userList.get(0);
TUseruser2=(TUser)userList2.get(0);
Transactiontx=session.beginTransaction();
Transactiontx2=session2.beginTransaction();
user2.setUserType(99);
tx2.commit();
user.setUserType(1);
tx.commit();
執行以上代碼,代碼將在tx.commit()處拋出StaleObjectStateException異常,並指出版本檢查失敗,當前事務正在試圖提交一個過期數據。通過捕捉這個異常,我們就可以在樂觀鎖校驗失敗時進行相應處理。