### Hibernate中的事务与并发 ###
**事务相关的概念**
1. 什么是事务
* 事务就是逻辑上的一组操作,组成事务的各个执行单元,操作要么全都成功,要么全都失败.
* 转账的例子:冠希给美美转钱,扣钱,加钱。两个操作组成了一个事情!
2. 事务的特性
* 原子性 -- 事务不可分割.
* 一致性 -- 事务执行的前后数据的完整性保持一致.
* 隔离性 -- 一个事务执行的过程中,不应该受到其他的事务的干扰.
* 持久性 -- 事务一旦提交,数据就永久保持到数据库中.
3. 如果不考虑隔离性:引发一些读的问题
* 脏读 -- 一个事务读到了另一个事务未提交的数据.
* 不可重复读 -- 一个事务读到了另一个事务已经提交的update数据,导致多次查询结果不一致.
* 虚读 -- 一个事务读到了另一个事务已经提交的insert数据,导致多次查询结构不一致.
4. 通过设置数据库的隔离级别来解决上述读的问题
* 未提交读:以上的读的问题都有可能发生.
* 已提交读:避免脏读,但是不可重复读,虚读都有可能发生.
* 可重复读:避免脏读,不可重复读.但是虚读是有可能发生.
* 串行化:以上读的情况都可以避免.
5. 如果想在Hibernate的框架中来设置隔离级别,需要在hibernate.cfg.xml的配置文件中通过标签来配置
* 通过:hibernate.connection.isolation = 4 来配置
* 取值
* 1—Read uncommitted isolation
* 2—Read committed isolation
* 4—Repeatable read isolation
* 8—Serializable isolation
**丢失更新的问题**

1. 如果不考虑隔离性,也会产生写入数据的问题,这一类的问题叫丢失更新的问题。
2. 例如:两个事务同时对某一条记录做修改,就会引发丢失更新的问题。
* A事务和B事务同时获取到一条数据,同时再做修改
* 如果A事务修改完成后,提交了事务
* B事务修改完成后,不管是提交还是回滚,如果不做处理,都会对数据产生影响
3. 解决方案有两种
* 悲观锁
* 采用的是数据库提供的一种锁机制,如果采用做了这种机制,在SQL语句的后面添加 for update 子句
* 当A事务在操作该条记录时,会把该条记录锁起来,其他事务是不能操作这条记录的。
* 只有当A事务提交后,锁释放了,其他事务才能操作该条记录
* 乐观锁
* 采用版本号的机制来解决的。会给表结构添加一个字段version=0,默认值是0
* 当A事务在操作完该条记录,提交事务时,会先检查版本号,如果发生版本号的值相同时,才可以提交事务。同时会更新版本号version=1.
* 当B事务操作完该条记录时,提交事务时,会先检查版本号,如果发现版本不同时,程序会出现错误。
4. 使用Hibernate框架解决丢失更新的问题
* 悲观锁
* 使用session.get(Customer.class, 1,LockMode.UPGRADE); 方法
* 乐观锁
* 1.在对应的JavaBean中添加一个属性,名称可以是任意的。例如:private Integer version; 提供get和set方法
* 2.在映射的配置文件中,提供<version name="version"/>标签即可。
### Hibernate中的事务与并发 ###的更多相关文章
- 09.Hibernate中的事务与并发
事务1. 什么是事务 * 事务就是逻辑上的一组操作,组成事务的各个执行单元,操作要么全都成功,要么全都失败. * 转账的例子:冠希给美美转钱,扣钱,加钱.两个操作组成了一个事情! 2. 事务的特性 * ...
- Hibernate中的事务隔离问题(脏读、不可重复读、幻读)
Hibernate中的事务隔离问题(脏读.不可重复读.幻读) 1.事务的特性 事务的四个特性: 1)原子性:事务是进行数据库操作的最小单位,所以组成事务的各种操作是不可分割的 2)一致性:组成事务的各 ...
- 具体解释Hibernate中的事务
1.前言 上一篇博客解说了Hibernate中的一级缓存,属于Session级别的.这篇博客解说一下Hibernate中的事务机制. 有关事务的概念.请參照通俗易懂数据库中的事务. 2.怎样处理Hi ...
- Microsoft SQL Server中的事务与并发详解
本篇索引: 1.事务 2.锁定和阻塞 3.隔离级别 4.死锁 一.事务 1.1 事务的概念 事务是作为单个工作单元而执行的一系列操作,比如查询和修改数据等. 事务是数据库并发控制的基本单位,一条或者一 ...
- Hibernate中的事务隔离
在我们的项目中,老发现程序报告sesssion is closed或者因数据已经被其他事务修改而导致当前事务无法提交,由于系统的运行用户最多也就几十个人,所以考虑使用严格的事务隔离来防止这种类型的问题 ...
- spring+hibernate中的事务
上下文: 从数据库服务器上获取数据可以,保存的时候增加了事务提交,即em.flush方法,报错no transaction in progress 报错信息: no transaction in pr ...
- hibernate中的事务管理是怎么概念?
1.JDBC事务 JDBC 事务是用 Connection 对象控制的.JDBC Connection 接口( java.sql.Connection )提供了两种事务模式:自动提交和手工提交. ja ...
- Hibernate中事务声明
Hibernate中JDBC事务声明,在Hibernate配置文件中加入如下代码,不做声明Hibernate默认就是JDBC事务. 一个JDBC 不能跨越多个数据库. Hibernate中JTA事务声 ...
- 在Hibernate中分别使用JDBC和JTA事务的方法
在Hibernate中使用JDBC事务 Hibernate对JDBC进行了轻量级的封装,它本身在设计时并不具备事务处理功能.Hibernate将底层的JDBCTransaction或JTATransa ...
随机推荐
- tab标签页(选项卡)插件
<body style="margin: 50px;"> <ul id="nav" class="nav nav-tabs" ...
- ORA-16047: DGID mismatch between destination setting and standby
主库有报错如下: ORA-16047: DGID mismatch between destination setting and standby 原因:主库参数设置错误,检查下列参数:log_arc ...
- 六、Docker+Gitlab
原文:六.Docker+Gitlab (1)下载镜像: docker pull gitlab/gitlab-ce (2)运行镜像: GITLAB_HOME=`pwd`/data/gitlab dock ...
- JS实践与写博客-序
大二的时候,就开始接触JavaScript了. 当时学了1年多,主要是认真看了一本JavaScript的入门书籍,了解了JavaScript大致怎么回事.在独自做Web项目的时候,用的都是JavaSc ...
- Redmine安装
http://www.itnpc.com/news/web/146433249372595.html http://www.cnblogs.com/iluzhiyong/p/redmine.html ...
- iOS中 学会如何对sqlite3 进行封装
#waring ---(看官注意) ---使用说明: ①在创建自定义model类之前让该类继承自文件中的Model类, ②为model类选一个NSString属性作为主键:(既,在初始化方法里面将从父 ...
- 28. Spring Boot配置方式
转自:https://blog.csdn.net/webzhuce/article/details/54564019
- 10559 - Blocks(方块消除|DP)
该题乍一看和矩阵链乘非常类似,但是有一个不同之处就是该题能够拼接 . 为了达到这个目的.我们不得不拓展维度d[i][j][k].用一个k表示最右边拼接了k个和a[j]同样颜色的方块. 问题的关键在 ...
- ejs模板引擎的使用
引入ejs.min.js 创建模板,以<%=jsCode%>包裹起来其余的html和html结构一样 focusTemplateData是模板使用的数据,使用$.each()方法遍历绑定数 ...
- 使用Surging Mqtt 开发基于WS的MqttClient客户端
原文:使用Surging Mqtt 开发基于WS的MqttClient客户端 最近一段时间由于要做一套智能设备系统,而有幸了解到Surging中的Mqtt broker,学习了很多东西本篇文章基于Su ...