昨天发了一个有关Hibernate事务管理的帖子到JavaEye上结果被批的很惨,所以今天痛下决心恶补一课,好好学习一下Hibernate事务管理。
那份帖子地址:http://www.iteye.com/my_topic/24662 我觉得一点都不丢人,我能写出这个问题也是经过很多思考、问过很多人的,不了解的人不止我一个,让大家一起共勉。
以下内容是参考孙MM的精通Hibernate
1. 介绍数据库事务、事务隔离级别、悲观锁、乐观锁等概念。
2.数据库ACID特征:
Atomic(原子性):指整个数据库事务是不可分割的工作单元。
Consistency(一致性):指数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。
Isolation(隔离性):指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。
Durability(持久性):指的是只要事务成功结束,它对数据库所作的更新就必须永久保存下来。
3.数据库系统支持两种事务模式:
自动提交模式:每个SQL语句都是一个独立的事务,当数据库系统执行完一个SQL语句后,会自动提交事务。
手动提交模式:必须由数据库客户程序显示指定事务开始边界和结束边界。
4.MySQL中数据库表分为3种类型:INNODB、BDB和MyISAM,其中MyISAM不支持数据库事务。MySQL中create table 语句默认为MyISAM类型。
5.对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题,这些并发问题可归纳为以下几类:
A.第一类丢失更新:撤销一个事务时,把其他事务已提交的更新数据覆盖。
B.脏读:一个事务读到另一个事务为提交的更新数据。
C.虚读:一个事务读到另一个事务已提交的新插入的数据。
D.不可重复读:一个事务读到另一个事务已提交的更新数据。
E.第二类丢失更新:这是不可重复读中的特例,一个事务覆盖另一个事务已提交的更新数据。
6.数据库系统提供了四种事务隔离级别供用户选择:
A.Serializable(串行化):一个事务在执行过程中完全看不到其他事务对数据库所做的更新。
B.Repeatable Read(可重复读):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,但是不能看到其他其他事务对已有记录的更新。
C.Read Commited(读已提交数据):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,而且能看到其他事务已经提交的对已有记录的更新。
D.Read Uncommitted(读未提交数据):一个事务在执行过程中可以拷打其他事务没有提交的新插入的记录,而且能看到其他事务没有提交的对已有记录的更新。
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以有优先考虑把数据库系统的隔离级别设为Read Commited,它能够避免脏读,而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。
7.当数据库系统采用read Commited隔离级别时,会导致不可重复读喝第二类丢失更新的并发问题,可以在应用程序中采用悲观锁或乐观锁来避免这类问题。从应用程序的角度,锁可以分为以下几类:
A.悲观锁:指在应用程序中显示的为数据资源加锁。尽管能防止丢失更新和不可重复读这类并发问题,但是它会影响并发性能,因此应该谨慎地使用。
B.乐观锁:乐观锁假定当前事务操作数据资源时,不回有其他事务同时访问该数据资源,因此完全依靠数据库的隔离级别来自动管理锁的工作。应用程序采用版本控制手段来避免可能出现的并发问题。
8.悲观锁有两种实现方式:
A.在应用程序中显示指定采用数据库系统的独占所来锁定数据资源。SQL语句:select ... for update,在Hibernate中使用get,load时如session.get(Account.class,new Long(1),LockMode,UPGRADE)
B.在数据库表中增加一个表明记录状态的LOCK字段,当它取值为“Y”时,表示该记录已经被某个事务锁定,如果为“N”,表明该记录处于空闲状态,事务可以访问它。增加锁标记字段就可以实现。
9.利用Hibernate的版本控制来实现乐观锁
乐观锁是由程序提供的一种机制,这种机制既能保证多个事务并发访问数据,又能防止第二类丢失更新问题。
在应用程序中可以利用Hibernate提供的版本控制功能来视线乐观锁,OR映射文件中的<version></version>元素和<timestamp></timestamp>都具有版本控制的功能,一般推荐采用<version></version>
分享到:
相关推荐
在学习过程中,阅读博客如《spring hibernate 事务管理学习笔记(一)》是非常有益的,它通常会包含具体的示例代码和实践建议。你可以参考这个博客链接(https://microjava.iteye.com/blog/525973),结合实际项目,...
在本篇“Spring Hibernate 事务管理学习笔记(二)”中,我们将深入探讨Spring框架与Hibernate集成时如何实现高效、安全的事务管理。这是一篇关于源码分析和技术工具使用的文章,适合对Java开发和数据库操作有基础...
Transient和Detached状态的对象统称为VO(Value Object),不被Hibernate管理,而Persistent对象被称为PO(PersistentObject),由Hibernate的实体管理容器管理,其变更会在事务提交时同步到数据库。 其次,实体...
【hibernate事务管理机制】是指在使用Hibernate框架进行数据库操作时,如何管理和协调事务的一系列规则和策略。事务管理是确保数据一致性、完整性和并发控制的重要机制。 **悲观锁**是预防性的锁定策略,它假设并发...
1. **事务管理**:Spring的事务管理模块可以与Hibernate无缝集成,提供声明式事务管理,简化了事务的控制代码。 2. **依赖注入**:Spring的DI功能可以用来管理Hibernate SessionFactory和Session的创建和销毁,使得...
在Spring框架中集成和配置Hibernate事务管理是企业级Java应用中的常见实践,它能提供高效且灵活的事务处理策略。Spring作为一款强大的依赖注入(DI)和面向切面编程(AOP)容器,能够轻松地管理和协调不同数据访问...
2. **AOP**:允许在不修改源代码的情况下,向代码中添加额外的功能(如日志、事务管理)。 3. **Bean**:Spring中的核心组件,由IOC容器管理其生命周期和属性。 4. **MyBatis集成**:Spring可以与MyBatis等持久层...
本篇文章将深入探讨Spring与Hibernate整合下的事务管理,帮助开发者理解并掌握这一关键知识点。 首先,Spring框架提供了声明式事务管理,这是通过AOP(Aspect-Oriented Programming,面向切面编程)实现的。在...
本教程将深入探讨如何在Spring框架中利用`TransactionInterceptor`进行声明式事务管理,与Hibernate集成实现高效的数据库事务控制。 首先,了解事务管理是至关重要的。事务是一组数据库操作,这些操作要么全部成功...
总结,本项目展示了如何在Spring MVC和Hibernate环境中实现事务管理,通过MyEclipse自动生成的包和配置文件,简化了开发流程。在实际应用中,这样的整合能够提供高效且易于维护的Web应用,同时,声明式事务管理极大...
【hibernate_day02笔记】...以上就是Hibernate_day02笔记中的主要知识点,包括ORM思想、实体类设计、主键策略、操作实体类的方法、对象状态、一级缓存以及事务管理。这些内容构成了使用Hibernate进行数据库操作的基础。
总的来说,Hibernate第一天的学习涵盖了基本的环境配置、对象关系映射、主键生成策略、`SessionFactory`和`Session`的使用,以及事务管理和缓存机制。理解并掌握这些基础概念,是进一步深入学习Hibernate和进行实际...
通过本文的学习,我们了解到Hibernate中事务处理的基本原理及其实现方法。正确地管理事务不仅可以提升应用的健壮性,还能有效避免数据不一致等问题。在实际项目中,根据具体的业务场景选择合适的事务管理模式是非常...
本篇文章将深入探讨Hibernate中的事务管理,包括其核心概念、事务的隔离级别、事务的提交与回滚以及源码分析。 ### 1. 事务核心概念 事务是数据库操作的基本单位,它保证了一组操作的原子性、一致性、隔离性和持久...
首先,我们来理解Hibernate中的事务管理。在数据库操作中,事务是保证数据一致性的重要手段。一个事务包含了一组数据库操作,这些操作要么全部成功,要么全部回滚。在Hibernate中,事务可以通过编程式或声明式的方式...
2. **Hibernate事务**: Hibernate本身也提供了一种事务管理机制,但在Spring环境中,我们通常使用Spring的事务管理器来协调。当@Transactional注解应用于方法上,Spring会在该方法执行前后自动管理事务的开始和结束...
在Hibernate中,事务、并发控制和缓存管理是至关重要的概念,它们极大地影响了应用程序的性能和数据一致性。 一、Hibernate事务管理 在数据库操作中,事务确保了数据的一致性和完整性。Hibernate提供了四种事务隔离...
Spring将事务管理分成了两类: * 编程式事务管理 * 手动编写代码进行事务管理.(很少使用) * 声明式事务管理: * 基于TransactionProxyFactoryBean的方式.(很少使用) * 需要为每个进行事务管理的类,配置一个...