【Hibernate】---- 锁

来源:互联网 发布:dg加密软件 编辑:程序博客网 时间:2024/06/06 12:36

    学习Hibernate锁的知识笔记

锁主要是解决并发性问题。本篇博客就来说说Hibernate中的悲观锁和乐观锁。

    【悲观锁】
        1. 原理:通常是有数据库机制实现的,在整个过程中把数据锁住(查询时),只要事务不释放(提交/回滚),那么任何用户都不能查看或修改
        2. 实例:库存管理。
        3. 代码实现:
public void testLoad1() {        Session session = null;        try {            session = HibernateUtils.getSession();            session.beginTransaction();            Inventory inv = (Inventory)session.load(Inventory.class, "1001", LockMode.UPGRADE);            System.out.println("opt1-->itemNo=" + inv.getItemNo());            System.out.println("opt1-->itemName=" + inv.getItemName());            System.out.println("opt1-->quantity=" + inv.getQuantity());            //执行减库存操作            inv.setQuantity(inv.getQuantity() - 200);                  session.getTransaction().commit();        }catch(Exception e) {            e.printStackTrace();            session.getTransaction().rollback();        }finally {            HibernateUtils.closeSession(session);        }    } 
在上面的代码中,用的load查询方法和之前的不一样,而是加上了锁的机制,该方法详细说明如下图所示:

加上锁后,就不会因为其它用户的操作而使得读取的数据是脏数据。但存在的缺陷是如果加锁的用户一直没有将事务提交或回滚,其他用户都无法对数据表进行操作。相比之下,乐观锁的解决方案就不会存在这样的问题,下面就看看乐观锁如何实现。
    【乐观锁】
    1. 原理:大多数的使用是采用数据版本的方式(version)实现,一般在数据库中加入一个version字段在读取数据的时候将version读取出来,在保存数据的时候判断version的值是否小于数据库中的version值,如果小于不予更新,否则给予更新。
    2. 示例:库存管理。
    3. 代码实现:
因为加入版本,所以在实体类中也需要加入version属性。映射文件配置也有些许改动:
<?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><!-- 加上optimistic-lock属性,检查version -->    <class name="com.bjpowernode.hibernate.Inventory" table="t_inventory" optimistic-lock="version">        <id name="itemNo">            <generator class="assigned"/>        </id>        <!-- version标签 -->        <version name="version"/>        <property name="itemName"/>        <property name="quantity"/>    </class></hibernate-mapping>  
并且,在执行方法中,也不再需要加上锁的机制去查询:
public void testLoad1() {        Session session = null;        try {            session = HibernateUtils.getSession();            session.beginTransaction();            Inventory inv = (Inventory)session.load(Inventory.class, "1001");            System.out.println("opt1-->itemNo=" + inv.getItemNo());            System.out.println("opt1-->itemName=" + inv.getItemName());            System.out.println("opt1-->version=" + inv.getVersion());            System.out.println("opt1-->quantity=" + inv.getQuantity());                        inv.setQuantity(inv.getQuantity() - 200);                        session.getTransaction().commit();        }catch(Exception e) {            e.printStackTrace();            session.getTransaction().rollback();        }finally {            HibernateUtils.closeSession(session);        }    } 
【总结】
    总是觉得锁的问题很复杂,但通过对Hibernate中悲观锁和乐观锁的实现,发现还是挺简单的。锁的应用在实际的大型数据项目中应该都会应用,或许代码没这么简单,但思想都是一样的。 


1 0
原创粉丝点击