zoukankan      html  css  js  c++  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映射

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

      

  • 相关阅读:
    转:【实用教程】阿里云服务器的配置和使用
    C# 定制错误页面
    C# Session进程外存储
    NOIP200101数的计算
    周末舞会
    queue 队列
    信息学作文
    求三个数的平均数
    Hello world
    Django-Form组件-forms.Form
  • 原文地址:https://www.cnblogs.com/wlx520/p/4724027.html
Copyright © 2011-2022 走看看