Hibernate 菜鸟教程 18 乐观锁
2017-02-02 20:25
471 查看
GitHub
简介
乐观锁就如同SVN一样,修改一次,版本号自增1。如果另一个线程同时修改,获取的版本号和修改时的不匹配,就会抛出异常。
模型对象
public class Product { private Long id; private String name; private Integer number;// 库存数量 // 定义为私有字段 //只能在Product类内部修改, 这里是直接由Hibernate管理的 private Integer version;
映射文件
<class name="Product"> <id name="id"> <generator class="native" /> </id> <!-- 私有字段access="field"配置 --> <version name="version" access="field" /> <property name="name" /> <property name="number" /> </class>
测试类
package com.jege.hibernate.z_optimistic_lock; import org.hibernate.Session; import org.hibernate.StaleObjectStateException; import org.junit.Before; import org.junit.Test; public class MainTest { @Before public void save() throws Exception { Product product = new Product(); product.setName("xxxx"); product.setNumber(10); Session session = HibernateUtils.getSession(); session.beginTransaction(); session.save(product); session.getTransaction().commit(); session.close(); } // 模拟2个事务在进行毫秒级别update操作 @Test public void update() throws Exception { try { Session session1 = HibernateUtils.getSession(); Session session2 = HibernateUtils.getSession(); session1.beginTransaction(); session2.beginTransaction(); Product product = (Product) session1.get(Product.class, 1L); product.setNumber(product.getNumber() - 8); Product product2 = (Product) session2.get(Product.class, 1L); product2.setNumber(product2.getNumber() - 5); session2.update(product2); session1.update(product); session1.getTransaction().commit(); session2.getTransaction().commit(); session1.close(); session2.close(); } catch (StaleObjectStateException e) { Session session3 = HibernateUtils.getSession(); Product product = (Product) session3.get(Product.class, 1L); System.out.println("库存已经改变,请重新刷新再次购买:" + product.getNumber()); } } }
源码地址
https://github.com/je-ge/hibernate如果觉得我的文章或者代码对您有帮助,可以请我喝杯咖啡。
您的支持将鼓励我继续创作!谢谢!
相关文章推荐
- Java程序员从笨鸟到菜鸟之(七十六)细谈Hibernate(十八)悲观锁和乐观锁解决hibernate并发
- Hibernate 菜鸟教程 2 创建maven工程
- JPA 菜鸟教程 18 自动把firstName+lastName合并为name字段
- Struts2 Spring3 Hibernate3 菜鸟教程 集成注解版本
- Struts2 Spring3 Hibernate3 菜鸟教程 集成xml版本-2
- 传智播客Hibernate视频教程学习笔记18
- Hibernate 菜鸟教程 16 二级缓存
- Hibernate 菜鸟教程 15 一级缓存
- Hibernate 菜鸟教程 3 单表操作
- Hibernate 菜鸟教程 8 复合主键
- Hibernate 菜鸟教程 7 双向一对一
- Hibernate 菜鸟教程 17 查询缓存
- Hibernate 菜鸟教程 12 继承 Join策略
- Hibernate 菜鸟教程 1 枚举单例类
- Hibernate 菜鸟教程 6 双向多对多
- Hibernate 菜鸟教程 10 组成关系
- Spring Boot 菜鸟教程 18 itext导出pdf下载
- Hibernate 菜鸟教程 14 继承 PerTable策略
- Hibernate 菜鸟教程 异常 集锦
- Hibernate 菜鸟教程 5 双向多对一