【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
- hibernate锁
- Hibernate锁
- hibernate 锁
- Hibernate锁
- Hibernate锁
- Hibernate锁
- hibernate 锁
- Hibernate锁
- 【Hibernate】---- 锁
- hibernate 锁
- Hibernate 乐观锁 org.hibernate.StaleObjectStateException 异常
- Hibernate 乐观锁 org.hibernate.StaleObjectStateException 异常
- Hibernate的锁
- Hibernate的锁机制
- Hibernate乐观锁
- hibernate的锁机制
- Hibernate乐观锁简介
- hibernate的锁机制
- 可变参数宏(用于调试)
- uva 532
- 实现一个自己的网络浏览器
- 逻辑运算
- bzoj 2721: [Violet 5]樱花 线性筛
- 【Hibernate】---- 锁
- 数组实现大数四则运算
- java学习(8)
- 《利用Python进行数据分析》第二章pivot_table报错问题
- flume高并发优化——(13)扩展三级文件配置&利用Headers扩展属性
- XML注释与取消注释快捷键
- RelativeLayout相对布局和ImagView、RadioGroup
- 定时脚本
- 个人总结