是在多线程同时访问到同一数据并且先后修改同一数据,采用乐观锁的版本更新机制来处理...
因为使用session.commit()提交数据时会清理缓存,如果发现缓存里面存有数据而会执行update语句进行id与version匹配,但是version的值现在已经改变,无法修改数据库的数据,所以就会报出org.hibernate.StaleObjectStateException异常。当我使用s.evict(tempClass)把这个对象重缓存中清理出去的时候就不会了....
可是把对象清理出去没有实际意义...
该考虑如何控制它呢?

解决方案 »

  1.   

    你到底是要乐观版本控制,还是不要?
    既然version都改变了,抛出异常,就是为了让你抓住,然后处理的。你想直接提交,用什么version?
      

  2.   

    肯定是采用乐观版本控制... 
    你没有仔细看我的问题吧。我说的是使用乐观锁而出现的一种情况。这是我的测试代码
    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)
    )