Hibernate使用乐观锁来处理脏数据问题。

比如有这样一个制造脏数据的场景:

1、通过session1得到id=1的对象product1

2、在product1原来的价格基础上增加100

3、更新product1之前,通过session2得到id=1的对象product2

4、在product2原来的价格基础上增加100

5、更新product1

6、更新product2

但是最后product的价格只增加了100,而不是200.

二、在不使用乐观锁的情况下代码如下:

package com.demo.test;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

import com.demo.pojo.Product;

public class TestHibernate{
    public static void main(String[] args){
        SessionFactory sf=new Configuration().configure().buildSessionFactory();
        Session session1=sf.openSession();
        Session session2=sf.openSession();
        
        session1.beginTransaction();
        session2.beginTransaction();
        
        Product p1=(Product)session1.get(Product.class,1);
        System.out.println("原来的基础价格:"+p1.getPrice());//原来基础价格为100
        
        p1.setPrice(p1.getPrice()+100);
        
        Product p2=(Product)session2.get(Product.class,1);
        p2.setPrice(p2.getPrice()+100);
        
        session1.update(p1);
        session2.update(p2);
        session1.getTransaction().commit();
        session2.getTransaction().commit();
        
        Product p=(Product)session1.get(Product.class,1);
        System.out.println("经过两次价格增加,价格变为:"p.getPrice());//经过两次后才为200
        
        session1.close();
        session2.close();
        sf.close();
    }
}
View Code

相关文章: