数据库事务
数据库的事务指的是把一系列的数据库操作组成一个单元,这个单元中的所有操作,这些操作要么全部完成,要么全部取消。
事务的特性(acid)
数据库事务必须具备ACID特性,ACID是Atomic(原子性)、Consistency(一致性)、Isolation(隔离性)和Durability(持久性)的英文缩写。
原子性:一个事务是有一个单元组成的,这个单元包含对数据库的若干个操作,而这些操作,要么全部成功,如果有一个失败,所有的操作全部取消,恢复到初始状态.
一致性:指数据库事务不能破坏关系数据的完成性以及业务逻辑上的一致性。例如对银行转帐事务,不管事务成功还是失败,应该保证事务结束后ACCOUNTS表中用户A和用户B的存款总额相等.
隔离性:指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间,不进行相互干扰。
持久性:指的是只要事务成功结束,它对数据库所做的更新就必须永久保存下来。即使发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功结束时的状态。
编程式与声明式事务:
编程(Programmatical)式
声明式(Declarative)
事务的隔离级别
企业级的数据库每一秒钟都可能应付成千上万的并发访问,因而带来了并发控制的问题。由数据库理论可知,由于并发访问,在不可预料的时刻可能引发如下几个可以预料的问题:
脏读:包含未提交数据的读取。例如,事务1 更改了某行。事务2 在事务1 提交更改之前读取已更改的行。如果事务1 回滚更改,则事务2 便读取了逻辑上从未存在过的行。
不可重复读取:当某个事务不止一次读取同一行,并且一个单独的事务在两次(或多次)读取之间修改该行时,因为在同一个事务内的多次读取之间修改了该行,所以每次读取都生成不同值,从而引发不一致问题。
第二类丢失更新:是不可重复读的一种特例,如上,乙不做第二次查询而是直接操作完成,帐户内最终为100元,甲的操作被覆盖掉了,银行损失100元。感觉和第一类丢失更新类似。
幻象:通过一个任务,在以前由另一个尚未提交其事务的任务读取的行的范围中插入新行或删除现有行。带有未提交事务的任务由于该范围中行数的更改而无法重复其原始读取。
事务隔离级别:
Read Uncommitted:
- 更新丢失(false)
- 脏读(true)
- 不可重复读(true)
- 幻读(true)
Read Committed:
- 更新丢失(false)
- 脏读(false)
- 不可重复读(true)
- 幻读(true)
Repeatable Read:
- 更新丢失(false)
- 脏读(false)
- 不可重复读(false)
- 幻读(true)
Serializable:
- 更新丢失(false)
- 脏读(false)
- 不可重复读(false)
- 幻读(false)
Hibernate 中的事务
Hibernate中事务管理API
org.hibernate.Transaction
Commit()
Rollback()
锁:
ibernate当中,从宏观的角度设置数据库的不同的事务隔离级别来控制事务之间的并发执行。
微观角度,使用乐观锁或者悲观锁进一步对事务进行细化的并发控制
悲观锁
悲观锁(Pessimistic Locking),悲观的认为每次读取或者修改数据库时,其它的事务也在并发访问相同的数据
Transaction tx = session.beginTransaction();
Query query = session.createQuery("from Testbook tb");
query.setLockMode("tb",LockMode.UPGRADE);
List<Testbook> list=query.list();
tx.commit();
Session对象的lock()方法设置悲观锁
Transaction tx=session.beginTransaction();
Testbook tb=(Testbook)session.get(Tsetbook.class,new Integer(1));
session.lock(tb,LockMode.UPGRADE);
tx.commit();
或者
Transaction tx=session.beginTransaction();
Testbook tb=(Testbook)session.get(Tsetbook.class,new Integer(1),LockMode.UPGRADE);
tx.commit();
乐观锁
乐观锁,乐观的认为数据库中的数据很少发生同时被操作的问题。实现上,乐观锁可以通过数据的版本号(Version)比较机制实现
平衡应用系统的性能和数据一致性之间的矛盾,实际开发中,可以在数据库中设定隔离级别为ReadCommited,然后在程序中,在需要锁定的代码上面实现乐观锁定
版本号方式实现乐观锁:
public class Testbook implements java.io.Serializable{
//用来记录版本号,不需要提高getter与setter方法
private Interger version;
}
<class name="com.rbh.examples.Testbook" table="TESTBOOK"
optimistic-lock="version">
<id name="id" type="java.lang.Integer"></id>
<version name="version" column="version" access="field"/>
时间戳实现乐观锁:
public class Testbook implements java.io.Serializable{
private java.sql.Timestamp updateTime;
}
<class name="com.rbh.examples.Testbook" table="TESTBOOK">
<id name="id" type="java.lang.Integer"></id>
<timestamp name="updateTime" column="update_time"
access="field">
分享到:
相关推荐
【hibernate事务管理机制】是指在使用Hibernate框架进行数据库操作时,如何管理和协调事务的一系列规则和策略。事务管理是确保数据一致性、完整性和并发控制的重要机制。 **悲观锁**是预防性的锁定策略,它假设并发...
本文将深入探讨Spring与Hibernate整合时的事务管理,帮助你更好地理解和运用这些技术。 首先,Spring框架是Java企业级应用的基石,它提供了一种依赖注入(Dependency Injection,DI)的方式,使得组件之间的耦合度...
在本篇“Spring Hibernate 事务管理学习笔记(二)”中,我们将深入探讨Spring框架与Hibernate集成时如何实现高效、安全的事务管理。这是一篇关于源码分析和技术工具使用的文章,适合对Java开发和数据库操作有基础...
### hibernate 事务管理注意...综上所述,Hibernate事务管理的合理配置对于保证系统的稳定性和数据一致性至关重要。开发者应该充分了解Hibernate的缓存机制及其对事务管理的影响,并根据实际情况灵活调整事务管理策略。
2. Hibernate事务管理:使用`HibernateTransactionManager`结合SessionFactory进行事务控制。 3. AOP(面向切面编程)在事务管理中的应用:`TransactionInterceptor`基于AOP拦截方法调用,处理事务。 4. 配置事务...
1. **Hibernate事务管理:** - Session API:Hibernate的Session对象是操作数据库的基本单元,它支持begin、commit和rollback等事务操作。 - Transaction API:Hibernate的Transaction接口提供了更高级别的事务...
在Spring框架中集成和配置Hibernate事务管理是企业级Java应用中的常见实践,它能提供高效且灵活的事务处理策略。Spring作为一款强大的依赖注入(DI)和面向切面编程(AOP)容器,能够轻松地管理和协调不同数据访问...
在Hibernate中,事务管理主要分为两种模式:编程式事务管理和声明式事务管理。 1. **编程式事务管理**: 在编程式事务管理中,开发者需要手动开始、提交、回滚事务。这通常通过`Session`对象的`beginTransaction()...
Spring将事务管理分成了两类: * 编程式事务管理 * 手动编写代码进行事务管理.(很少使用) * 声明式事务管理: * 基于TransactionProxyFactoryBean的方式.(很少使用) * 需要为每个进行事务管理的类,配置一个...
**Hibernate事务管理详解** 在Java开发中,尤其是在企业级应用中,事务管理是不可或缺的一部分。Hibernate作为一款流行的ORM(对象关系映射)框架,提供了强大的事务处理能力。本篇文章将深入探讨Hibernate中的事务...
一、Hibernate事务管理 在数据库操作中,事务确保了数据的一致性和完整性。Hibernate提供了四种事务隔离级别:读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ)和串行化...
本项目是关于如何使用Spring MVC与Hibernate结合来实现事务管理的实践教程,通过MyEclipse自动生成所需的包和配置文件。这里将详细讲解这一过程,以及涉及到的关键知识点。 首先,Spring MVC作为Spring框架的一部分...
2. **Hibernate事务管理**: - Hibernate提供了`Session`和`SessionFactory`,它们是与数据库交互的主要对象。`Session`负责单个数据库会话,而`SessionFactory`在整个应用程序生命周期中只创建一次,用于生成`...
Hibernate事务管理是Java开发中非常重要的一个环节,尤其是在企业级应用开发中,它与数据库的交互密切相关,确保数据的一致性和完整性。Hibernate作为一款流行的ORM(对象关系映射)框架,提供了一种方便的方式来...
本篇文章将深入探讨如何在Spring AOP中实现Hibernate事务管理,以及这一过程中的关键概念和技术细节。 首先,让我们了解什么是Spring AOP。AOP是一种编程范式,它允许程序员定义“切面”,这些切面是跨越多个对象的...
Hibernate 事务管理是 ORM 框架中的重要组成部分,它负责确保数据操作的一致性和完整性。在 Hibernate 中,事务管理可以基于 JDBC Transaction 或 JTA (Java Transaction API) 进行,这两种方式各有特点。 首先,...
这种情况可能是由于开发人员手动执行了数据库操作,而没有使用Hibernate提供的API,这将导致Hibernate事务管理机制失效。 三、解决方法 要解决该问题,可以采取以下步骤: 1. 重启服务器:这是最简单的解决方法,...
二、Hibernate事务管理 Hibernate本身也支持事务管理,但通常与Spring集成时,我们使用Spring的事务管理。`HibernateTransactionManager`是Spring提供的专门用于管理Hibernate事务的类,它会自动处理Hibernate ...
#### 二、Hibernate事务管理机制 Hibernate 本身不实现事务逻辑,而是依赖于底层的数据源(JDBC 或 JTA)来实现事务管理。这意味着,当你使用 Hibernate 进行数据操作时,所涉及的事务要么基于 JDBC 的事务管理,要么...
### 详解Hibernate事务处理机制 #### 一、引言 Hibernate作为一款优秀的对象关系映射(ORM)框架,在Java开发领域扮演着极其重要的角色。它不仅简化了数据持久化的复杂性,还提供了一系列强大的功能来支持高效的...