你的位置:首页 > Java教程

[Java教程]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映射

<??><!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如果需要转载,请注明出处,谢谢!!