是在多线程同时访问到同一数据并且先后修改同一数据,采用乐观锁的版本更新机制来处理...
因为使用session.commit()提交数据时会清理缓存,如果发现缓存里面存有数据而会执行update语句进行id与version匹配,但是version的值现在已经改变,无法修改数据库的数据,所以就会报出org.hibernate.StaleObjectStateException异常。当我使用s.evict(tempClass)把这个对象重缓存中清理出去的时候就不会了....
可是把对象清理出去没有实际意义...
该考虑如何控制它呢?
因为使用session.commit()提交数据时会清理缓存,如果发现缓存里面存有数据而会执行update语句进行id与version匹配,但是version的值现在已经改变,无法修改数据库的数据,所以就会报出org.hibernate.StaleObjectStateException异常。当我使用s.evict(tempClass)把这个对象重缓存中清理出去的时候就不会了....
可是把对象清理出去没有实际意义...
该考虑如何控制它呢?
既然version都改变了,抛出异常,就是为了让你抓住,然后处理的。你想直接提交,用什么version?
你没有仔细看我的问题吧。我说的是使用乐观锁而出现的一种情况。这是我的测试代码
public void test1() {
Session s = HibernateUtil.getSession();//session是采用自己编写的hibernate的工具类获取的。
Transaction tr = s.beginTransaction();
try{
Account account = (Account) s.get(Account.class, 1);//×使用断点执行到这里,再把test2()方法执行完..
System.out.println(account.getMoney());
account.setMoney(account.getMoney() - 100);
System.out.println(account.getMoney());
tr.commit();//在这报出exception.
}catch(StaleObjectStateException e) {
e.printStackTrace();
}finally {
HibernateUtil.closeSession(s);//关闭session的时候还会报,并且在session那里抓取了所有的Exception。
}
} public void test2() {
Session s = HibernateUtil.getSession();
Transaction tr = s.beginTransaction();
Account account = (Account) s.get(Account.class, 1);
account.setMoney(account.getMoney() + 100);
tr.commit();
HibernateUtil.closeSession(s);
}数据库表结构CREATE TABLE account (
id int(11) NOT NULL AUTO_INCREMENT,
version int(11) NOT NULL,
money int(11) DEFAULT NULL,
PRIMARY KEY (id)
)