`

数据库事务(hibernate) 转载

阅读更多

  在多用户的数据库系统中,都有并发能力,一旦执行了并发,必然导致数据访问冲突。使用事务可以尽量避免并发访问时的冲突,使得数据库的并发访问和性能两方面取得均衡。

        不同的厂商在事务处理上有差异,一下针对Oracle,对事务方面的有关自己的理解,进一步说明Hibernate对事务的处理。

1.事务

        首先,事务是一系列操作组成的一个单元,要么全部完成,要么全部取消。从SQL编程的角度来说,其组成单元主要由对数据进行CRUD操作的SQL语句组成。Oracle数据库在默认情况下任何一个DML语句都会开始一个事务,知道执行commit或rollback操作,当前十五才会结束。数据库具有ACID四个特性:

原子性(Atomicity):一个事务由一个单元组成,单元中所有的操作组成一个原子操作,全部成功或全部失败。

一致性(Consistency):事务所操作的数据在事务执行前后必须在逻辑上保持一直。

隔离性(Isolation):当前事务与其他未完成的事务之间相互隔离,在数据库事务中可以设置事务的不同的隔离级别。

持久性(Durability):对数据库中的数据更新都要写到硬盘中,如果在操作中发生未知情况,数据库保证未结束的事务在下次数据库启动后被全部撤销;结束的事务把修改的结果写入到磁盘,保证数据修改的持久化。

2.并发访问引发的冲突问题

(1) 丢失更新:事务T1和T2并发更新同一数据,读取要操作的数据后T1执行更新结束并提交事务,T2执行更新后回滚,那么T1丢失更新。

(2) 脏读 :T1读取到T2尚未提交的数据,如果T2回滚,则T1读取的数据为脏数据。

(3) 不可重复读:T1两次读取数据库中同一行数据,但是结果不同,或者是第二次未读到,T2在两次读取期间更新或删除了该数据并且提交了。

(4) 2类丢失更新:T1和T2读取同一行数据,其中T1更新数据并提交事务,T2也更新数据并且提交事务,导致T1的操作无效。

(5) 幻读 :T1两次执行响度的查询,但是得到的结果集不同,T2在期间插入新数据并提交。

3.事务的隔离级别

       隔离性是事务的特性之一,它通过为数据库中的表或者字段加锁来实现。数据加锁后在同一时间只允许一个事务执行更新或读取,导致并发能力下降。 为了便于平衡数据库的性能和数据的一致性,隔离级别分为以下几种:

(1) 读未提交 : T1可以读取T2已更新但尚未提交的数据,但在T2提交前不允许其他事务写入。可能出现脏读,但不会出现丢失更新。此种隔离级别的出错率颇高!

(2) 读提交  : T1仅可读取并且不能更新T2已经提交的更新数据,否则发生等待。可能出现不可重复读和幻读,但不会出现脏读。Oracle的默认隔离级别。

(3) 重复读 :T1读取的数据不允许其他事务写入。可能出现幻读。

(4) 序列化 :最高隔离级别,所有事务序列化执行,不能并发执行。

Oracle支持默认级别为读已提交,尽管会导致不可重复读和幻读问题,但是可以再应用中使用悲观锁或乐观锁加以控制。设置隔离级别:set transaction isolation level read committed.

4. Hibernate中的事务处理

     Hibernate是对JDBC的封装,本身不具备事务处理能力,它将事务处理交给底层的JDBC或JTA。

5. Hibernate 锁

     Hiberbate可以从宏观角度设置数据库的不同事务隔离级别来控制事务之间的并发执行,还可以从微观的角度使用乐观锁或者悲观锁进一步控制。而锁是数据库系统中的一个重要概念,共享锁、排他锁;表级锁、行级锁。

悲观锁:顾名思义,采用悲观的态度,认为所有的并发操作都会造成数据访问冲突。只有当第一个事务操作完成并释放锁后,第二个事务才能继续访问。能防止丢失更新和不可重复读的问题,但是降低了并发性。使用Query、Criteria、Session都可以显示设置悲观锁。

乐观锁:采取乐观的态度,认为很少发生同时操作。大多数通过数据的版本号比较机制实现。

Hibernate的LockMode

 (1)LockMode.NONE  : 不加锁(默认),读取数据首先从缓存中读取,如果缓存中没有,则从数据库中读取。

 (2)LockMode.READ  : 共享读锁,不管缓存中是否存在要读取的数据,总是直接从数据库中读取。隔离级别设置为重复读和序列化时,Hibernate读取数据,自动使用这种锁定模式。

 (3)LockMode.WRITE: 在数据库中插入或更新时锁定,Hibernate在写入数据时自动使用这种锁定模式。

 (4)LockMode.UPGRADE: 使用悲观锁,Hibernate底层使用SQL的for update字句,加锁后其他事务无法并发访问。

 (5)LockMode.UPGRADE_NOWAIT: 和上一个类似,不过使用的是 for update nowait锁定。

 (6)LockMode.FORCE : 乐观锁,使用版本号方式。

 

6. Hibernate实现乐观锁

   第一种: 版本号(version)方式,表中新增一个number类型的not null 字段version,更新时该版本号会+1,在hbm映射文件中,在class定义中添加optimistic-lock="version",在字段和属性的映射中添加上新增字段version即可:<version name="" column="" access="field"/>。

  第二种:时间戳的方式实现,表中有一个timestamp类型的字段专门记录该条数据最后更新时间。使用此标签:<timestamp name="" column="" access="field"/>

 

在更新时会比较版本号或者时间戳,如果当前版本号比数据库中的版本号小,则说明是试图提交过期数据而抛出异常。

分享到:
评论

相关推荐

    hibernate官方入门教程 (转载)

    5. **Session接口**: Session是Hibernate的核心接口,负责与数据库进行交互,执行CRUD操作,同时也提供了事务管理功能。 6. **SessionFactory**: SessionFactory是线程安全的,用于创建Session实例,它由配置文件...

    Hibernate缓存机制,转载

    **标题:“Hibernate缓存机制,转载”** **描述:**这篇博客主要探讨了Hibernate框架中的缓存机制,包括一级缓存和二级缓存的概念、工作原理以及如何在实际开发中应用。 **标签:“源码 工具”** **知识点详解:*...

    jdbc与hibernate的优缺点比较(转载的精髓).pdf

    综上所述,JDBC更适合于对性能要求高且数据库操作相对简单的场景,而Hibernate则适用于需要快速开发、对象关系映射和事务管理的复杂应用。在选择使用哪种技术时,需要根据项目需求、团队技能和性能要求来平衡。在...

    jsr168 portlet(struts2+spring2.5+hibernate3.3)(转载)

    开发者可以从中学到如何设置portlet的生命周期,如何在Struts2中配置动作和结果,如何利用Spring管理服务和事务,以及如何使用Hibernate进行数据库操作。此外,通过阅读和理解这个项目的源码,还能加深对portlet规范...

    (转载)自己动手写一个spring

    5. **数据访问/集成**: 包括JDBC、ORM(Object-Relational Mapping,如Hibernate)、OXM(Object-XML Mapping,如JAXB)等支持,方便数据库和XML的交互。 6. **Web模块**: 提供了MVC框架、WebSocket支持、Servlet...

    本项目是基于SpringBoot的线上宠物物资购买系统,为个人毕业设计,未经允许禁止转载.zip

    4. **JPA and Hibernate**: Java持久层API和其最常用的实现,用于操作数据库。 5. **Thymeleaf or other Template Engines**: 用于渲染动态视图,将数据与HTML模板结合。 6. **RESTful API**: 设计API遵循REST原则,...

    Java 最常见 200+ 面试题全解析:面试必备.pdf

    17. MySQL:作为关系型数据库管理系统,介绍其数据表操作、索引优化、事务处理、备份恢复等知识。 18. Redis:非关系型内存数据库,用于存储键值对数据,涉及数据类型、持久化策略、缓存使用等主题。 19. JVM:...

    JAVA文章精选542个(txt) 免费分享

    可能涉及JPA(Java Persistence API)或Hibernate等框架,讲解如何创建实体类,配置映射文件,以及执行CRUD操作。 2. **转:第一部分:EJB 体系结构的历史和目标.txt**: EJB(Enterprise JavaBeans)是Java EE...

    Java面试题

    10. **数据库操作**:掌握JDBC基本操作,事务处理,以及SQL语句优化。了解ORM框架如Hibernate和MyBatis的工作原理。 11. **Spring框架**:理解依赖注入(DI)和面向切面编程(AOP)的概念,熟悉Spring Boot和Spring...

    springmybatis

    3. 在session 中完成对数据的增删改查和事务提交等. 4. 在用完之后关闭session 。 5. 在java 对象和 数据库之间有做mapping 的配置文件,也通常是xml 文件。 mybatis实战教程(mybatis in action)之一:开发环境搭建 ...

Global site tag (gtag.js) - Google Analytics