2019独角兽企业重金招聘Python工程师标准>>>

一.事务的定义

1.物理上的数据库事务

2.逻辑上事务与persistence context有关

3.应用程序上的事务指的是一个工作单元

二.物理事务

hibernate支持JDBC和JTA事务处理

TransactionFactory的两个功能:

1.让hibernate理解当前环境的事务语义,例如当时是一个JTA环境?当前物理事务是活跃的?

2.充当org.hibernate.Transaction工厂,允许应用程序去管理和检查事务状态org.hibernate.Transaction是hibernate中逻辑事务的概念,JPA中有类似的javax.persistence.EntityTransaction接口,但是只支持resource-local事务

3.物理事务JDBC

使用

java.sql.Connection.commit()

和 java.sql.Connection.rollback(),设置autocommit为false,对应的事务工厂类JdbcTransactionFactory

4.物理事务JTA

使用javax.transaction.UserTransaction从底层org.hibernate.service.jta.platform.spi.JtaPlatform,对应的事务工程类JtaTransactionFactory

5.物理事务CMT

使用JTAjavax.transaction.TransactionManager,从底层org.hibernate.service.jta.platform.spi.JtaPlatform,对应的事务工程类CMTTransactionFactory,在实际JEE CMT环境,获取javax.transaction.UserTransaction是受限的。这里的CMT简单说就是事务不由hibernate transcation api管理,而由容器管理

6.物理事务custom

自己实现接口org.hibernate.engine.transaction.spi.TransactionFactory,初始器hibernate.transaction.factory_class,通过传入实例或者类名(必须有无参构造函数)

7.物理事务遗留

transactionFactory已经移到其他目录,短暂支持一段时间

三.事务使用

hibernate没有任何内存加锁,直接使用JTA和JDBC连接,事务完全依赖数据库的隔离级别,session提供事务级别的cache。

避免数据库锁竞争,保持物理数据库事务尽量短。

四.事务模式和反模式

1.session-per-operation反模式

每个数据库操作都提交事务,开关session

2.session-per-request模式

最常见模式,从请求开始处打开session,开始事务,然后执行一系列操作,最后提交事务,关闭session

session和事务是一对一的关系

为避免在应用中传递session,SessionFactory提供getCurrentSession方法,‘current’取决于currentsessioncontext

2种sessioncontext范围

JTASESSIONCONTEXT,提供回调,当事务结束时可以关闭session,session在事务范围内第一次调用getCurrentSession时打开

ManagedSessionConext,由应用程序自己管理范围,在范围的开始调用bind方法,在结束处调用unbind,通常由一个外部组件来管理生命周期,例如AOP拦截器或者Filter

3.conversation

长会话跨多个数据库事务,要保持原子性只有是前面的事务是读,只有一个事务是写(通常是最后一个),自动版本检查可以检查并发修改

session-per-request-with-detachedobjects,在用户思考时间,所有实体对象处于detached状态,hibernate允许重新attach对象到一个新的session用于更新和持久化

session-per-conversation,hibernate允许session断开底层jdbc连接,在新请求到来时重新连接,而且是同一个session,但是session不允许设置自动flush,必须显示调用

五.对象同一性和数据库同一性

一个应用程序可以并发的访问一个持久化状态(即数据库行),但是同一个持久化实例不会在多个session中共享。

数据库同一性

foo.getId().equals( bar.getId() )

JVM同一性

foo==bar

在同一个session中,hibernate保证两种同一性是一致的,虽然不推荐,在同一个session中可以使用==比较对象

乐观锁自动版本或者时间戳检查并发访问

在session外,使用==会有问题,比如导致可以放置两个detached对象到一个set里,但是实际是代表的同一行。所以需要覆盖hashcode和equals方法,但是不要使用数据库标示符来实现,因为transient的对象在持久化后会改变数据库标示符,这破坏了set的contract

关于数据库的隔离级别和实现,可参考

http://baike.baidu.com/view/2943500.htm

关于丢失更新,网上有些解释不正确,丢失更新应该是第二个事务失败,而把第一个事务的更新也回滚了。通过排他写锁实现读取未提交隔离级别,可防止。

转载于:https://my.oschina.net/heatonn1/blog/167480

Hibernate 事务总结相关推荐

  1. dbunit java_Java – 让DbUnit使用Hibernate事务

    我在尝试将Hibernate事务中的更改推送到数据库以使DbUnit在我的测试用例中正常工作时遇到问题.似乎DbUnit没有看到Hibernate所做的更改,因为它们还没有在事务结束时提交--而且我不 ...

  2. 【大话Hibernate】hibernate事务管理

    事务(Transaction)是工作中的基本逻辑单位,可以用于确保数据库能够被正确修改,避免数据只修改了一部分而导致数据不完整,或者在修改时受到用户干扰. 数据库向用户提供保存当前程序状态的方法,叫事 ...

  3. Spring中配置Hibernate事务的四种方式

    2019独角兽企业重金招聘Python工程师标准>>> 为了保证数据的一致性,在编程的时候往往需要引入事务这个概念.事务有4个特性:原子性.一致性.隔离性.持久性. 事务的种类有两种 ...

  4. Spring4.x(9)--Spring的Hibernate事务-XML

    Spring的Hibernate事务-XML 一.拷贝必要的jar包到工程的lib目录 二.创建spring的配置文件并导入约束 <?xml version="1.0" en ...

  5. Hibernate事务

    Hibernate事务控制     在实际生产中,每个业务逻辑都是由一系列对数据库访问完成的,这一系列的数据访问可能包括删除一些数据,然后再插入一些数据, 这里的删除和插入的动作不可分割,要么全部执行 ...

  6. Spring对Hibernate事务管理

    http://www.cnblogs.com/m-xy/archive/2013/05/14/3077627.html(挺好的) 还有一种用parent的配置方式,parent配置到哪个层面,事务就控 ...

  7. Hibernate事务管理-HibernateTransactionManager-对hibernate session的管理

    由于对SSH还停留在比较初级的应用水平上,今天在遇到一个疑惑时折腾了很久,具体问题是这样的, 有这么一个测试方法, 1 public static void test1() { 2 Applicati ...

  8. spring 中 Hibernate 事务和JDBC事务嵌套问题

    http://www.iteye.com/topic/11063?page=2 ---mixed ORM and JDBC usage is a feature of Spring DAO 这是Rod ...

  9. Hibernate事务管理

    事务只是一个工作单位(单元). 在这种情况下,如果一个步骤失败,则整个事务失败(称为原子性). ACID属性(原子性,一致性,隔离性和持久性)可以描述事务. Hibernate中的事务接口 在hibe ...

最新文章

  1. pytorch环境下“No module named SimpleITK”的解决办法
  2. SqlServer2000日志文件过大问题处理
  3. export default (imported as router) was not found_HTC 5G Hub 流动Router 评测分享
  4. 关于java包_关于Java包
  5. C++:String的写时拷贝
  6. PHP 基础 自动类型转换之比较运算符
  7. hdu5279 YJC plays Minecraft 【分治NTT】
  8. 基于消息队列的日志组件
  9. LeetCode 995. K 连续位的最小翻转次数(差分思想)
  10. 娄底八中的初中计算机考试,众人同心勤耕耘 敢叫日月换新天
  11. GIS中的基本概念收集
  12. 甘肃刘家峡赤壁“结”出多彩冰瀑
  13. 即时聊天工具国外盛行,国内发展缓慢
  14. 美国军方称密切关注量子加密,法国国防部重金投资量子技术
  15. Python处理txt文件
  16. 学生评语管理系统软件测试,学校教师老师综合评价评分系统软件
  17. 金山文字 职称计算机,计算机职称考试金山文字2005考试大纲
  18. 2021年软件测试工具总结——接口测试工具
  19. win10系统从旧固态迁移到新固态,win10系统迁移到固态硬盘ssd
  20. 高中数学必考知识点:二元一次不等式(组)及简单的线性规划问题

热门文章

  1. 为Linux上的Tomcat安装apr支持
  2. Linux 第70天 mariadb transaction, log
  3. ElasticSearch IK分词器安装
  4. 性能测试之手机号码python生成方式
  5. 赛门铁克《勒索软件与企业2016》调查报告:企业将面临更多勒索软件威胁
  6. ReDim Preserve 的用途
  7. [zt]如何用Javascript获得TextArea中的光标位置
  8. 基于Kotlin实现的GankIo客户端
  9. git-svn:通过git来管理svn代码
  10. python下py2exe打包笔记