Java实战之02Hibernate-06处理并发
十三、处理并发
1、事务的隔离级别
不考虑隔离级别出现的问题:
脏读:一个线程中的事务读到了另外一个线程中未提交的数据。
不可重复读:一个线程中的事务读到了另外一个线程中提交的update(更新)的数据。
虚读:一个线程中的事务读到了另外一个线程中提交的insert(插入)的数据。
事务的隔离级别:
1:READ UNCOMMITTED:脏读、不可重复读、虚读(幻读)都可能发生。
2:READ COMMITTED:避免脏读;不可重复读、虚读(幻读)都可能发生。
4:REPEATABLE READ:避免脏读、不可重复读,虚读(幻读)可能发生。
8:SERIALIZABLE:避免脏读、不可重复读、虚读(幻读)。
通过配置参数hibernate.connection.isolation=1|2|4|8进行设置。MySQL:默认4 Oracle:默认2
2、第二类更新丢失
//线程1
@Test
public void test1(){
Session s = HibernateUtil.getSession();
Transaction tx = s.beginTransaction();
Customer c1 = s.get(Customer.class, 1);
c1.setName("泰斯特");
tx.commit();
s.close();
} //线程2
@Test
public void test2(){
Session s = HibernateUtil.getSession();
Transaction tx = s.beginTransaction();
Customer c1 = s.get(Customer.class, 1);
c1.setAge(20);
tx.commit();
s.close();
}
3、解决丢失更新的方案
3.1、悲观锁(不是锁,是一种处理态度。是hibernate的)
Hibernate认为丢失更新现象一定会发生。悲观锁用的是数据库的锁机制。(独占模式效率肯定不会高)
数据库的锁机制:(是真正的锁)
共享锁:可以有多把锁。
|
MySQL客户端线程1 |
MySQL客户端线程2 |
|
开启事务 strat transaction; |
开启事务 strat transaction; |
|
执行查询:select * from customes where id = 1 lock in share mode; 加共享锁 |
执行查询:select * from customes where id = 1 lock in share mode; 加共享锁 |
|
执行更新:update customers set name='张三' where id = 1; 此时会自动加排他锁。但是由于线程2没有释放共享锁,所以线程1处于等待状态。 |
commit; 当线程2释放共享锁,线程1就可以执行成功了。 |
排他锁(独占模式,也称为独占锁):只能有一把锁,在锁之前,不能有任何的锁。执行写操作(insert,update,delete)的时候会自动加锁。
|
MySQL客户端线程1 |
MySQL客户端线程2 |
|
开启事务 strat transaction; |
开启事务 strat transaction; |
|
执行查询:select * from customes where id = 1 for update; 加排他锁 |
执行查询:select * from customes where id = 1 lock in share mode ; 由于有线程1的排他锁存在,线程2将处于等待状态 |
|
执行更新:update customers set age = 50 where id = 1; 此时还没有释放排他锁 |
|
|
提交事务(释放排他锁) commit; |
线程2显示查询结果,已经是线程1改过之后的数据了。 |
死锁:DEADLOCK
|
MySQL客户端线程1 |
MySQL客户端线程2 |
|
开启事务 strat transaction; |
开启事务 strat transaction; |
|
执行查询:select * from customes where id = 1 lock in share mode; 加共享锁 |
执行查询:select * from customes where id = 1 lock in share mode; 加共享锁 |
|
执行更新:update customers set name='张三' where id = 1; 此时会自动加排他锁。但是由于线程2没有释放共享锁,所以线程1处于等待状态。 |
执行更新:update customers set age=18 where id = 1; 此时会自动加排他锁。但是由于线程1没有释放共享锁,所以线程2处于等待状态。 |
|
结果:线程1等着线程2释放共享锁,而线程2等着线程1释放排他锁。就造成了死锁。 |
|
//线程1
@Test
public void test1(){
Session s = HibernateUtil.getSession();
Transaction tx = s.beginTransaction();
Customer c1 = s.get(Customer.class, 1,LockMode.PESSIMISTIC_WRITE);//hibernate处理丢失更新的悲观锁解决方式
//Customer c1 = s.get(Customer.class, 1);
c1.setName("泰斯特");
tx.commit();
s.close();
} //线程2
@Test
public void test2(){
Session s = HibernateUtil.getSession();
Transaction tx = s.beginTransaction();
Customer c1 = s.get(Customer.class, 1,LockMode.PESSIMISTIC_WRITE);
//Customer c1 = s.get(Customer.class, 1);
c1.setAge(20);
tx.commit();
s.close();
}
3.2、乐观锁(不是锁,是一种处理态度)
Hibernate认为丢失更新现象不一定会发生。乐观锁使用的是版本号机制。

private Integer id;
private String name;
private Integer age;
//================版本号==================
private Integer version;
//=======================================
//一对多关系映射:一个客户可以有多个订单
private Set<Order> orders = new HashSet<Order>(0); public Customer(){ }
<class name="Customer" table="T_CUSTOMERS">
<id name="id" column="id">
<generator class="native"></generator>
</id>
<!-- 版本字段,用于解决丢失更新 -->
<version name="version"></version> <property name="name" column="NAME"></property>
<property name="age" column="AGE"></property>
<!-- 一对多关系映射:
set元素:
作用:映射集合元素
属性:
name:映射实体类中的集合属性
table:指定对应的表
key元素:它是set的子元素
作用:就是用于指定外键的
属性:
column:指定外键字段的名称
one-to-many元素:它是set的子元素
作用:描述当前实体映射文件和set中指定属性之间的关系。
属性:
class:指定是从表的实体类名称
-->
<set name="orders" table="T_ORDERS" >
<key column="CUSTOMER_ID"></key>
<one-to-many class="Order"/>
</set>
</class>
Java实战之02Hibernate-06处理并发的更多相关文章
- Java生鲜电商平台-高并发核心技术订单与库存实战
Java生鲜电商平台-高并发核心技术订单与库存实战 一. 问题 一件商品只有100个库存,现在有1000或者更多的用户来购买,每个用户计划同时购买1个到几个不等商品. 如何保证库存在高并发的场景下是安 ...
- Java 面试知识点解析(二)——高并发编程篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
- Java多线程学习(七)并发编程中一些问题
本节思维导图: 关注微信公众号:"Java面试通关手册" 回复"Java多线程"获取思维导图源文件和思维导图软件. 多线程就一定好吗?快吗?? 并发编程的目的就 ...
- JAVA NIO non-blocking模式实现高并发服务器
JAVA NIO non-blocking模式实现高并发服务器 分类: JAVA NIO2014-04-14 11:12 1912人阅读 评论(0) 收藏 举报 目录(?)[+] Java自1.4以后 ...
- Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论
Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...
- java高级精讲之高并发抢红包~揭开Redis分布式集群与Lua神秘面纱
java高级精讲之高并发抢红包~揭开Redis分布式集群与Lua神秘面纱 redis数据库 Redis企业集群高级应用精品教程[图灵学院] Redis权威指南 利用redis + lua解决抢红包高并 ...
- JAVA NIO non-blocking模式实现高并发服务器(转)
原文链接:JAVA NIO non-blocking模式实现高并发服务器 Java自1.4以后,加入了新IO特性,NIO. 号称new IO. NIO带来了non-blocking特性. 这篇文章主要 ...
- 「小程序JAVA实战」springboot的后台搭建(31)
转自:https://idig8.com/2018/08/29/xiaochengxujavashizhanspringbootdehoutaidajian31/ 根据下面的图,我们来建立下对应的sp ...
- 20145219 《Java程序设计》第06周学习总结
20145219 <Java程序设计>第06周学习总结 教材学习内容总结 InputStream与OutputStream 串流设计 1.串流:Java将输入/输出抽象化为串流,数据有来源 ...
- Java多线程之同步集合和并发集合
Java多线程之同步集合和并发集合 不管是同步集合还是并发集合他们都支持线程安全,他们之间主要的区别体现在性能和可扩展性,还有他们如何实现的线程安全. 同步集合类 Hashtable Vector 同 ...
随机推荐
- iOS开发-相关文档
关于调试,查看Xcode Overview文档相关部分:http://developer.apple.com/library/ios/documentation/ToolsLanguages/Conc ...
- JNI-数据类型
转载:http://blog.csdn.net/conowen/article/details/7523145 在Java中有两类数据类型:primitive types,如,int, float, ...
- 数学之路(3)-机器学习(3)-机器学习算法-SVM[5]
svm小结 1.超平面 两种颜色的点分别代表两个类别,红颜色的线表示一个可行的超平面.在进行分类的时候,我们将数据点 x 代入 f(x) 中,如果得到的结果小于 0 ,则赋予其类别 -1 ,如果 ...
- lightoj1104(数学概率与期望)
题意: 增加一年有n天; 那么至少有几个人,能够保证至少两个人同一天生日的概率大于等于0.5; 思路: 转化一下题意; 就是求全部人生日都不同的概率小于等于0.5(那么至少两个人同一天就是大于等于0, ...
- C#操作Excel文件(读取Excel,写入Excel)
看到论坛里面不断有人提问关于读取excel和导入excel的相关问题.闲暇时间将我所知道的对excel的操作加以总结,如今共享大家,希望给大家可以给大家带了一定的帮助.另外我们还要注意一些简单的问题1 ...
- Windows二进制文件的Python扩展包
http://www.lfd.uci.edu/~gohlke/pythonlibs/ https://pypi.python.org/simple/
- 《RESTful Web Services》第四章 设计URI
引言 URI是跨越Web的资源描述符,一个URI由以下内容组成——协议.主机.端口号.路径
- Jenkins 安装与配置
1. 软件准备 a. 下载 jenkins.war:https://wiki.jenkins-ci.org/display/JENKINS/Meet+Jenkins. 本文以 Jenkins 为演示版 ...
- 大设计时代:针对超大网页布局的一些思考和建议 [Aseoe]
对于有些设计项目来说,老套的设计模式并不奏效,你需要设计的大点,要比以往设计的元素还要大,因此就非常适合采用超大网页布局.无论是采用大块大块的背景照片还是背景视频,超大网页布局的效果非常显著:极具视觉 ...
- web service 部署
写的不好,全当是写给自己看的吧. 公司用飞天诚信的加密狗对网站进行加密,我要部署加密狗的web service.注:web service 由加密狗公司提供. 1.新建网站dog