Hibernate处理事务并发问题
在Hibernate中设置事务的隔离级别。
<property name="hibernate.connection.isolation">2</property>
隔离级别代号。
1:Read Uncommitted
2: Read Committed
4: Repeatable Read
8: Serializable
数据库系统锁的基本原理
为了避免各种并发问题,以保证数据的完整性和一致性,数据库系统采用锁来实现事务的隔离性。
锁的类型
- -共享锁:用于读数据操作。允许其他事务同时读取资源,但不允许其它事务更新。
- -独占锁:用于修改数据的场合。它锁定的资源,其他事务不能读取也不能修改。
锁的基本原理如下
- -当一个事务访问某种数据库资源时,如果执行select语句,必须先获得共享锁。如果执行update、insert、delete语句,必须先获得独占锁。
- -当第二个事务也要访问相同的资源时,如果执行select语句,也必须获得共享锁。如果执行update、insert、delete语句,也必须先获得独占锁。
- -此时根据锁的类型。来决定第二个事务是应该等待第一个事务完成,还是可以立即获得锁。
许多数据库系统都有自动管理锁的功能,能够根据事务执行的sql语句,自动为资源加上适当的锁。
悲观锁和乐观锁
悲观锁 :
指在应用程序显式的为数据资源加锁。悲观锁假定当前事务操纵数据资源时,一定会有其他事务同时访问资源。为了避免当前事务受到干扰,先锁定资源。悲观锁能够防止丢失更新和不可重复读等并发问题,但是会影响并发性能。需要谨慎使用。 悲观锁对事务处理很悲观,总是认为其他事务会占用资源。
当事务执行select语句时,默认使用共享锁来锁定查询的语句。也可以使用 select ..... lock in share mode来指定使用共享锁。
使用select .... for update来指定采用独占锁来锁定查询的记录
例如取款:select * from bank where id=1 for update
那么这条记录就被锁定,其他事务如果要处理这条数据,必须停下来等待。直到我们的取款事务结束。
Hibernate应用中,当通过Session的get()和load()方法来加载一个对象时,可以采用以下方式使用悲观锁。
Session.get(Clsss,OID,锁的类型);
锁的类型
LockMode.UPGRADE:使用悲观锁,也就是独占锁。
乐观锁 :
乐观锁假定当前事务操纵数据资源时,不会有其他事务同时访问该数据资源。
因此完全由数据库的隔离级别来控制,或者我们自己来实现。乐观锁对事务的态度总是很乐观。
实现的原理
在数据表中添加Version字段,初始化为0,事务提交的前提是我的数据Version字段必须比数据库中的Version字段小1。
例如同时两个付款单,A付款事务的时候会先取出金额,然后付款,修改余额,然后将version字段加1
B付款事务执行同样的操作,然后事务提交。
如果A先提交事务,version变为1.B再提交的时候version也变为1,然后就会发现Version的值是一样的,这时就会抛出异常
Hibernate帮我们实现了这种操作。
我们需要在我们的实体类中添加一个version属性,并添加get/set方法。
然后在实体类的映射文件中配置这个属性,紧跟在<id>元素后面有一个version元素,name值为version属性名。
<version name="version"></version>
Hibernate处理事务并发问题的更多相关文章
- Hibernate中事务小案例
理论知识: 什么是事务? 指作为单个逻辑工作单位执行的一系列操作,要么完全的执行,要么完全不执行.事务处理可以确保非事务性单元内的所有操作都完全完成,否则永久不会更新面向数据的资源.通过将一组操作组合 ...
- (转载)Hibernate的事务管理
Hibernate的事务管理 事务(Transaction)是工作中的基本逻辑单位,可以用于确保数据库能够被正确修改,避免数据只修改了一部分而导致数据不完整,或者在修改时受到用户干扰.作为一名软件设计 ...
- Hibernate学习笔记(三)—— Hibernate的事务控制
Hibernate是对JDBC的轻量级封装,其主要功能是操作数据库.在操作数据库过程中,经常会遇到事务处理的问题,接下来就来介绍Hibernate中的事务管理. 在学习Hibernate中的事务处理之 ...
- Hibernate的事务管理
Hibernate的事务管理 事务(Transaction)是工作中的基本逻辑单位,可以用于确保数据库能够被正确修改,避免数据只修改了一部分而导致数据不完整,或者在修改时受到用户干扰.作为一名软件设计 ...
- JavaWeb_(Hibernate框架)Hibernate中事务
Hibernate中事务 事务的性质 事物的隔离级别 配置事务的隔离级别 事务的性质 原子性:原子,不可再分,一个操作不能分为更小的操作,要么全都执行,要么全不执行. 一致性:事务在完成时,必须使得所 ...
- Hibernate中事务的隔离级别设置
Hibernate中事务的隔离级别,如下方法分别为1/2/4/8. 在Hibernate配置文件中设置,设置代码如下
- Select for update/lock in share mode 对事务并发性影响
select for update/lock in share mode 对事务并发性影响 事务并发性理解 事务并发性,粗略的理解就是单位时间内能够执行的事务数量,常见的单位是 TPS( transa ...
- Mysql加锁过程详解(4)-select for update/lock in share mode 对事务并发性影响
Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...
- (转)MySQL优化笔记(八)--锁机制超详细解析(锁分类、事务并发、引擎并发控制)
当一个系统访问量上来的时候,不只是数据库性能瓶颈问题了,数据库数据安全也会浮现,这时候合理使用数据库锁机制就显得异常重要了. 原文:http://www.jianshu.com/p/163c96983 ...
随机推荐
- golang 如何将imagemagick 和golang 打包到docker 环境中
公司最近开发了个项目,用到了imagemagick 和golang 环境,在我本地机上开发妥妥的,结果准备部署到线上环境的时候,出现了大坑,尝试了无数次后,最后还是解决了,官方说有问题也不说清楚点,一 ...
- 参数ref与out
通常我们向方法中传递的是值,方法获得的是这些值的一个拷贝,然后使用这些拷贝,当方法运行完毕后,这些拷贝将被丢弃,而原来的值不会受到影响. 这种情况是通常的,当然还有另外一种情况,我们向方法传递参数的形 ...
- numpy的基础运算-【老鱼学numpy】
概述 本节主要讲解numpy数组的加减乘除四则运算. np.array()返回的是numpy的数组,官方称为:ndarray,也就是N维数组对象(矩阵),N-dimensional array obj ...
- 配置ubuntu的超管账号密码
1 在搭建ubuntu 之后 只有自己的账号 2 root 用户是没有配置好的 需要重新配置 3 passwd root 4 输入新密码即可
- HTTP协议是无状态的
含义: 无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态.从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系 实际中的使用情况: 在web应用中,我 ...
- 【软件工程】分布式版本控制系统Git的安装与使用
作业的要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2097 远端库地址:https://github.com/Richa ...
- Gym 100963B
Gym 100963B啊,郁闷,就tm调小了一点范围就A了,就写dp和贪心比较一下,范围到最大值的二倍-1就好了假设最大值的2倍以内能满足最优条件,当金额范围超过最大值2倍的时候:至于为什么,还不清楚 ...
- Python学习之MySQLdb模块
摘要: MySQLdb模块用于操作mysql数据库.1.安装MySQLdb模块 yum install MySQL-python -y2.操作流程①.导入模块: import MySQLdb②.连接数 ...
- 项目之初的模型设计与status状态字段
0X01 开始做一个app的时候,要先做的是流程设计与数据库模型设计. 但做的模型设计往往是设置字段满足当前的需求,缺乏足够的经验,即使为以后的功能预留出位置,也无法考虑周全. 比如,刚开始做用户表, ...
- Auth模块、Forms组件
Auth模块 auth模块是Django自带的用户认证模块: 我们在开发一个网站的时候,无可避免的需要设计实现网站的用户系统.此时我们需要实现包括用户注册.用户登录.用户认证.注销.修改密码等功能,这 ...