Hibernate锁机制

Hibernate提供了两种锁机制:悲观锁和乐观锁。

悲观锁和乐观锁的区别:

乐观锁 悲观锁

不管有多少线程同时访问同一条数据;给数据加上一个版本号;每次提交数据的时候对比
如果提交的数据版本高于数据库版本;那么进行更新(版本号—+1);如果提交的数据版
本低于
数据库版本则提交失败(取决于谁先提交数据)


当有一个线程在访问数据库中的某一条记录的时候;悲观的认为其他的线程有可能也要访问;
这时就悲观的把这条记录锁定(基于数据库锁机制完成);得到事务提交之后自动释放
缺点:当数据长时间不提交的时候;其他的线程无法进行对数据操作;这样对数据库的
连接成本
开销非常高(不适用)

以乐观锁为例:

用部门表为例:

package com.msit.hibernate.entity;

import java.util.Set;

/**
 * 部门
 * @author Administrator
 * 在部门的角度关系:一对多(一个部门多个员工)one-to-many
 */
public class Department {
    
    private int id;
    private String name;
    private int ver;
    private Set<Employee> emps;//员工集合
    
    /**
     * @return the ver
     */
    public int getVer() {
        return ver;
    }
    /**
     * @param ver the ver to set
     */
    public void setVer(int ver) {
        this.ver = ver;
    }
    /**
     * @return the emps
     */
    public Set<Employee> getEmps() {
        return emps;
    }
    /**
     * @param emps the emps to set
     */
    public void setEmps(Set<Employee> emps) {
        this.emps = emps;
    }
    /**
     * @return the id
     */
    public int getId() {
        return id;
    }
    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }
    /**
     * @return the name
     */
    public String getName() {
        return name;
    }
    /**
     * @param name the name to set
     */
    public void setName(String name) {
        this.name = name;
    }
    
    
}

Department.hbm映射

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping
    package="com.msit.hibernate.entity">
    <!-- 对象 关系 映射 -->
    <class name="Department" table="t_department">
        <id name="id">
            <generator class="increment"/>
        </id>
                  <!--必须在id节点下-->
        <version name="ver"/>
        
        <property name="name" />
        
        <!-- 
            lazy:是否采用延迟加载策略;默认值为true 
            fetch:采用什么抓取策略;默认为逐条抓取select
         -->
        <set name="emps" cascade="all" >
            <key column="depart_id"></key><!-- 对应员工表中的外键 -->
            <one-to-many class="Employee" />
        </set>
        
    </class>

</hibernate-mapping>

 

测试类:

package com.msit.hibernate.lock;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.msit.hibernate.entity.Department;
import com.msit.hibernate.tool.HibernateUtil;

public class Lock {

    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        lock();
        //add();
    }
    
    static void lock(){
        
        Session session = HibernateUtil.getSession();
        Transaction tx = session.beginTransaction();
        Department dpt = (Department) session.get(Department.class, 2);
        dpt.setName("人事部");
        System.out.println("数据版本1:"+dpt.getVer());
        
        Session session2 = HibernateUtil.getSession();
        Transaction tx2 = session2.beginTransaction();
        Department dpt2 = (Department) session2.get(Department.class, 2);
        dpt2.setName("人事");
        System.out.println("数据版本2:"+dpt2.getVer());
        
        tx2.commit();
        
        Department dpt3 = (Department) HibernateUtil.getSession().get(Department.class, 2);
        System.out.println("更新之后数据版本:"+dpt3.getVer());
        
        tx.commit();
        
    }
    
    static void add(){
        try {
            Session session = HibernateUtil.getSession();
            Transaction tx = session.beginTransaction();
            Department dpt = new Department();
            dpt.setName("人事部");
            session.save(dpt);
            tx.commit();
            
            
        } catch (HibernateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
        
    }

}

 

您可以通过点击 右下角 的按钮 来对文章内容作出评价, 也可以通过左下方的 关注按钮 来关注我的博客的最新动态。 

如果文章内容对您有帮助, 不要忘记点击右下角的 推荐按钮 来支持一下哦   

如果您对文章内容有任何疑问, 可以通过评论或发邮件的方式联系我: 2276292708@qq.com

如果需要转载,请注明出处,谢谢!!

  

posted on 2015-08-12 13:34  梦之航  阅读(464)  评论(0编辑  收藏  举报

导航