首页 > 学院 > 开发设计 > 正文

Hibernate锁机制

2019-11-15 01:06:56
字体:
来源:转载
供稿:网友
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如果需要转载,请注明出处,谢谢!!

  


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表