文档章节

Hibernate上路_19-事务的丢失更新

vigiles
 vigiles
发布于 2013/11/19 17:34
字数 674
阅读 363
收藏 9

事务的并发问题:脏读、不可重复读、幻读。
    脏读:一个事务读取另一个事务未提交的数据。
    不可重复读:在一个事务中,读取到另一个事务已经提交update数据,造成两次读取不一样。
    幻读:在一个事务中,读取到另一个事务已经提交insert数据,造成读取记录条数不一样。
    丢失更新:两个事务同时修改目标数据,后提交的事务,会覆盖之前提交的数据。

鉴于并发访问出现的以上问题,数据库提供了事务隔离级别:
    1. READ_UNCOMMITED:会发生以上所有问题
    2. READ_COMMITTED:阻止脏读的发生,会发生不可重复读和幻读(Oracle 默认级别)
    3. REPEATABLE_READ:阻止脏读和不可重复读发生,会发生幻读(MySQL 默认级别)
    4. SERIALIZABLE:不会发生并发问题,串行初始化(性能非常差,也不会使用)

1.MySql事务操作:

1start transaction:开始事务
2commit:提交事务

2.修改MySql事务隔离级别:

<hibernate-configuration>
	<session-factory>
		<!-- 修改事务隔离级别 -->
		<property name="hibernate.connection.isolation">2</property>

隔离级别对应数值:
    read uncommitted isolation --- 1
    read committed isolation ------ 2
    repeatable read isolation ------ 4
    serializable isolation ----------- 8 

丢失更新问题解决:
    悲观锁和乐观锁。

2.悲观锁:

假设丢失更新发生概率很大,底层原理使用数据库内部锁的机制。

    1Mysql数据库内部提供读锁(共享锁)、写锁(排它锁 );
    2)一张数据表允许添加多个读锁;
    3)一张数据表只能添加一个写锁,其与其他锁互斥。添加了写锁则不能再添加读锁;
    4)默认情况下,在修改记录时,会自动添加写锁;
    5)在执行查询时,也可以为数据添加共享锁和排它锁 
        select * from customer lock in share mode; 添加共享锁 
        select * from customer for update; 添加排它锁 
    6)悲观锁使用的即是排它锁。第1个修改执行select * from customer for update,第个操作(包括查询)需要等待
    session提供.get(Class class, Serializable id, LockMode lockMode); 

//类型,OID,锁
PojoUser user = (PojoUser) session.get(PojoUser.class, 1, LockMode.UPGRADE);
//更新操作
user.setName("XXxxx");
mysql 对应 LockMode UPGRADE
oracle  对应 LockMode UPGRADE_NOWAIT


3.乐观锁:

假设丢失更新发生概率不高,底层原理为数据添加版本号,由程序来维护版本。

1)在POJO中添加Integer version字段:

2)在POJO.hbm.xml中添加版本字段:

3)加断点在debug模式测试:

提交的版本号和数据库中版本不同则报错:

org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [cn.cvu.hibernate.domain.PojoUser#3] 

- end
  

© 著作权归作者所有

共有 人打赏支持
vigiles
粉丝 96
博文 84
码字总数 82564
作品 0
昌平
程序员
私信 提问
Java程序员从笨鸟到菜鸟之(六十五)细谈Hibernate(十六)数据库事务与隔离级别

数据库事务:事务是指一组相互依赖的操作行为,如银行交易、股票交易或网上购物。事务的成功取决于这些相互依赖的操作行为是否都能执行成功,只要有一个操作行为失败,就意味着整个事务失败。...

长平狐
2012/11/12
42
0
SSH框架之Hibernate5专题8:事务相关内容

1 数据库事务复习 1.1 事务四大特性(简称ACID) 1、原子性:(atomicity)事务中的全部操作在数据库中是不可分割的,要么全部完成,要么均不执行。 2、一致性:(Consistency)几个并行执行...

极客微信条
03/16
0
0
Hibernate事务和并发控制

Hibernate事务和并发控制 ++YONG原创,转载请注明 1. 事务介绍: 1.1. 事务的定义: 事务就是指作为单个逻辑工作单元执行的一组数据操作,这些操作要么必须全部成功,要么必须全部失败,以保...

mrliuze
2015/06/03
0
0
Hibernate事务与并发问题处理(乐观锁与悲观锁) [转]

Hibernate事务与并发问题处理(乐观锁与悲观锁) 一、数据库事务的定义   数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作。事务处理可以确保除非事务性单元...

祥子哥哥
2014/06/10
0
0
Hibernate多事物并发访问控制

在并发环境,一个数据库系统会同时为各种各样的客户程序提供服务,也就是说,在同一时刻,会有多个客户程序同时访问数据库系统,这多个客户程序中的失误访问数据库中相同的数据时,如果没有采...

猴亮屏
2014/11/12
0
0

没有更多内容

加载失败,请刷新页面

加载更多

vue-router的HTML5 History 模式设置

VUE是当下最火爆的前端框架之一,vue-router是vue项目中几乎都会用到的组件,然而体验一时爽,其实坑不少。本篇经验将详细介绍vue-router的两种mode效果和开发测试环境下的问题,并给出解决方...

peakedness丶
33分钟前
1
0
Dubbo 源码分析 - 服务引用

1. 简介 在上一篇文章中,我详细的分析了服务导出的原理。本篇文章我们趁热打铁,继续分析服务引用的原理。在 Dubbo 中,我们可以通过两种方式引用远程服务。第一种是使用服务直联的方式引用...

小刀爱编程
43分钟前
1
0
redis_集群原理

数据分布 数据分布理论 分布式系统数据分区规则:常见的有哈希分区和顺序分区两种。 哈希分区 常见的hash分区规则有:节点取余分区,一致性hash分区,虚拟槽分区. redis数据分区 redis集群功能...

grace_233
43分钟前
0
0
数据库(mysql)业务用户表批量造测试用户密码数据[方案]

博主这几天在配合公司测试做商城商品秒杀场景的压测,由于秒杀需要登录,所以需要为测试创建多个用户密码。此项任务可能在今后还会遇到,先做个笔录。同时,让小伙伴们需要的时候也可以有个参...

em_aaron
59分钟前
2
0
JDK_jvisualvm访问远程weblogic服务

1.首先需要在远程的weblogic的域下面,找到/bin/ setDomainEnv.sh ,需要在此文件下加入如下内容: -Dcom.sun.management.jmxremote.port=1090 ##端口号可以自己指定 -Dcom.sun.management.j...

四年级小学生
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部