<class><id><version name="" column/>//必须紧跟id</class>hibernate执行update语句时,先根据缓存中对象的version去匹配数据库update xxx set version=1 where xxx and version=0然后version加一,更新到session,因为其他事务得到的对象还是原来的,是游离对象,多以其他事务再执行上面的语句会报StaleObjectStateException.有两种方式处理:1.自动撤销事务2.通知用户数据被修改了,是否继续事务,还是撤销事务还可以使用<timestamp>跟version一样,只是这个是时间,version是数字加1。timestamp可能比version不安全,因为可能两个事务的时间是一样的。2.对游离对象进行版本检查session.lock(对象,LockMode.READ)lock设定为LockMode.READ,则马上进行版本检查,不会计划执行语句。数据库没有匹配到就包StaleObjectStateException。update()方法不会马上检查,会计划执行一条语句。等到清理缓存时,如果数据库没有匹配到就包StaleObjectStateException。
新闻热点
疑难解答