zoukankan      html  css  js  c++  java
  • 23hibernate_pessimistic_locking

    悲观锁

    悲观锁的实现,通常依赖于数据库机制,在整个过程中将数据锁定,其它任何用户都不能读取或修改
    ExportDB:
    create table t_inventory (itemNo integer not null auto_increment, itemName varchar(255), quantity integer, primary key (itemNo))


    public class Inventory {

        private int itemNo;
        
        private String itemName;
        
        private int quantity;
        
        <hibernate-mapping>
        <class name="com.bjsxt.hibernate.Inventory" table="t_inventory">
            <id name="itemNo">
                <generator class="native"/>
            </id>
            <property name="itemName"/>
            <property name="quantity"/>
        </class>
    </hibernate-mapping>

    package com.bjsxt.hibernate;

    import org.hibernate.Session;

    public class InitData {

        public static void main(String[] args) {
            Session session = null;
            try {
                session = HibernateUtils.getSession();
                session.beginTransaction();
                
                Inventory inv = new  Inventory();
                inv.setItemNo(1001);
                inv.setItemName("脑白金");
                inv.setQuantity(1000);
                
                session.save(inv);
                session.getTransaction().commit();
            }catch(Exception e) {
                e.printStackTrace();
                session.getTransaction().rollback();
            }finally {
                HibernateUtils.closeSession(session);
            }    
        }
    }

    Hibernate: insert into t_inventory (itemName, quantity) values (?, ?)

    mysql> select *   from t_inventory;
    +--------+----------+----------+
    | itemNo | itemName | quantity |
    +--------+----------+----------+
    |      1 | 脑白金   |     1000 |
    +--------+----------+----------+
    1 row in set (0.00 sec)

    TestLoad1:
    public void testLoad1() {
            Session session = null;
            try {
                session = HibernateUtils.getSession();
                session.beginTransaction();
                
                Inventory inv = (Inventory)session.load(Inventory.class1, LockMode.UPGRADE);
                System.out.println("itemName=" + inv.getItemName());
                System.out.println("quantity=" + inv.getQuantity());
                inv.setQuantity(inv.getQuantity() - 200);//1000
                session.update(inv);
                session.getTransaction().commit();
            }catch(Exception e) {
                e.printStackTrace();
                session.getTransaction().rollback();
            }finally {
                HibernateUtils.closeSession(session);
            }    
        }
    Hibernate: select inventory0_.itemNo as itemNo0_0_, inventory0_.itemName as itemName0_0_, inventory0_.quantity as quantity0_0_ from t_inventory inventory0_ where inventory0_.itemNo=? for update

    TestLoad2:

    public void testLoad2() {
            Session session = null;
            try {
                session = HibernateUtils.getSession();
                session.beginTransaction();
                
                Inventory inv = (Inventory)session.load(Inventory.class1, LockMode.UPGRADE);
                System.out.println("itemName=" + inv.getItemName());
                System.out.println("quantity=" + inv.getQuantity());
                inv.setQuantity(inv.getQuantity() - 200);
                session.update(inv);
                session.getTransaction().commit();
            }catch(Exception e) {
                e.printStackTrace();
                session.getTransaction().rollback();
            }finally {
                HibernateUtils.closeSession(session);
            }    
        }
    mysql> select *   from t_inventory;
    +--------+----------+----------+
    | itemNo | itemName | quantity |
    +--------+----------+----------+
    |      1 | 脑白金   |     1000 |
    +--------+----------+----------+
    1 row in set (0.00 sec)

    TestLoad1:
    Hibernate: select inventory0_.itemNo as itemNo0_0_, inventory0_.itemName as itemName0_0_, inventory0_.quantity as quantity0_0_ from t_inventory inventory0_ where inventory0_.itemNo=? for update

    TestLoad2:等待第一个事务的提交
    Hibernate: select inventory0_.itemNo as itemNo0_0_, inventory0_.itemName as itemName0_0_, inventory0_.quantity as quantity0_0_ from t_inventory inventory0_ where inventory0_.itemNo=? for update


    quantity=600
    Hibernate: update t_inventory set itemName=?, quantity=? where itemNo=?
    Hibernate: select inventory0_.itemNo as itemNo0_0_, inventory0_.itemName as itemName0_0_, inventory0_.quantity as quantity0_0_ from t_inventory inventory0_ where inventory0_.itemNo=? for update


    mysql> select *   from t_inventory;
    +--------+----------+----------+
    | itemNo | itemName | quantity |
    +--------+----------+----------+
    |      1 | 脑白金   |      600 |
    +--------+----------+----------+
    1 row in set (0.00 sec)
  • 相关阅读:
    5 年,只为了一个更好的校验框架
    springboot 中 inputStream 神秘消失之谜
    没啥用的黑科技——自动生成测试对象信息框架
    投资中最简单的事
    一个提升英文单词拼写检测性能 1000 倍的算法?
    基于 junit5 实现 junitperf 源码分析
    关于 junit4 90% 的人都不知道的特性,详解 junitperf 的实现原理
    性能测试到底该怎么做?
    从代码生成说起,带你深入理解 mybatis generator 源码
    java 实现中英文拼写检查和错误纠正?可我只会写 CRUD 啊!
  • 原文地址:https://www.cnblogs.com/alamps/p/2627906.html
Copyright © 2011-2022 走看看