事务(Transaction)是工作中的基本逻辑单位,可以用于确保数据库能够被正确修改,避免数据只修改了一部分而导致数据不完整,或是在修改时受到用户干扰。作为一名设计者,必须了解事务并合理利用,以确保数据库保存正确、完整的数据。数据库的主要职责是保存信息,因此它需要向用户提供保存当前程序状态的方法。同样,当事物执行过程中发生错误时,需要有一种方法使数据库忽略当前的状态,并回到前面保存的状态。这两种情况在数据库用语中分别称为提交事务和回滚事务。
1.1事务介绍
所谓事务,就是指作为单个逻辑工作单元执行的一系列操作,而这些逻辑工作单元需要具有原子性、一致性、隔离性和持久性4个属性。
原子性:事务必须是原子工作单元,将事务中所做的操作捆绑成一个单元,即对于事务所进行的数据修改等操作,要么全部执行,要么全部不执行。
一致性:事务在完成时,必须使所有的数据都保持一致状态,而且在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构都应该是正确的。
隔离性:由并发事务所做的修改必须与任何其他并发事务所做的修改相隔离。事务查看数据时数据所处的状态,要么是被另一并发事务修改之前的状态,要么是被另一并发事务修改之后的状态,即事务不会查看由另一个并发事务正在修改的数据。这种隔离方式也叫可串行性。
持久性:事务完成之后,它对系统的影响是永久的,即使出现系统故障也是如此。
数据库的事务很重要,不同的环境可以设置不同的事务方法。在一个不考虑系统性能的环境中,使用可串行化的事务可达到最好的事务隔离,但实际上并不常用可串行化的事务,因为它占用系统资源比较多。
1.2什么是事务隔离级别
事务隔离意味着对于某一个正在运行的事务来说,好像系统中只有这一个事务,其它并发的事务都不存在一样。大部分情况下,很少用完全隔离的事务,但这就带来了一下的一些问题:
1.更新丢失(Lost Update):两个事务都企图去更新一行数据,导致事务抛出例外退出,两个事务的更新都白费了。
2.脏数据(Dirty data):如果第二个应用程序使用了第一个应用程序修改过的数据,而这个数据处于未提交状态,这时就会发生脏读。第一个应用程序随后可能会请求加滚被修改的数据,从而导致第二个事务使用的数据被损坏,即所谓的“变脏”。
事务1 write(a) rollback()
事务2 read(a)
在这种情况下,脏读发生
3.不可重读(Unrepeatable read):一个事务两次读同一行数据,可是这两次读到的数据不一样。这可能是在这两次读数的中间,另一个事务也读了这行数据,一个事务写入数据并且提交了,另一个事务也写入并且提交了,那么第一个事务的写操作就丢失了。简单的说,如果一个事务在提交结果之前,另一个事务可以修改和删除它,就会发生不可重读。
事务1 read(a) read(a)
事务2 write(a)/or delete(a) commit()
在这种情况下,发生不可重读
4.幻读(Phantom read):一个事务执行了两次查询,发现第二次查询结果比第一次查询多出了一列,这可能是因为另一个事务在这两次查询之间插入了新行。例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改了这个表中的数据,这中修改是向表中插入一行新数据,那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好像发生了幻觉一样。
事务1 select(标准) select(标准)
事务2 update/create(与标准匹配) commit()
这种情况下,事务1每次从select上获取了不同的结果,就会发生“幻读”
由于事务的隔离性不完全而可能出现上述的一些问题,以下是一些隔离级别,用来防止上面那些问题
1.读操作未提交(read uncommitted):说明一个事务在提交前其变化对于其他事务来说是可见的。这样脏读、不可重复读和虚读都是允许的。当一个事务写入一行数据但并未提交,其它事务都不能再写入此行数据;但是,任何事务都可以读任何数据。这个隔离级别使用排写锁实现。
2.读操作已提交(read committed):读取未提交的数据是不允许的,它使用临时的共读锁和排写锁实现。读事务并不阻止其它事务进行数据,不过,如果一个事务正在写一行数据,它会阻止了其他所有想进入此行数据的事务。当一个事务运行在这个隔离级别时,一个select查询只能看到查询开始之前提交的数据而永远无法看到未提交的数据或则是在查询执行时其它并行事务提交所做的改变(不过select的确看得见处于同一次事务中前面更新的结果,即使他们还没有提交也看得到)。
3.可重复读(Repeatable read):说明事务保证能够再次读取相同的数据而不会失败,但虚读仍然出现。
4.可串行化(Serializable provide):提供最严格的事务隔离。这个级别模拟串行的事务,就好像事务将被一个接着一个那样串行,而不是并行的执行。不过,使用这个级别的应用必须准备在串行化失败时重新启动事务。
分享到:
相关推荐
事务管理是另一个重要部分,笔记会解释如何使用Hibernate的事务API来确保数据的一致性。同时,缓存机制,如一级缓存(First Level Cache)和二级缓存(Second Level Cache),也将被详细讨论,它们对于提高应用程序...
此外,笔记还可能涉及到Hibernate的二级缓存机制,包括SessionFactory级别的Cache和Query级别的Cache,以及常用的缓存提供商如Ehcache和Infinispan的配置和使用。缓存机制对于提高应用性能至关重要,尤其是在大数据...
【Hibernate学习笔记】 Hibernate 是一个流行的 Java 应用程序框架,用于对象关系映射(ORM),它简化了数据库操作,使开发人员能够使用面向对象的编程模型而不是直接编写 SQL 语句。以下是从标题和描述中提取的 ...
2. Session:在Hibernate中,Session是与数据库交互的主要接口,它负责保存和检索持久化对象,实现了事务管理和缓存功能。 3. Transaction:事务管理是数据库操作的基础,Hibernate提供了一种便捷的方式来处理事务,...
3. `hibernate.cfg.xml` 是 Hibernate 的主要配置文件,它包含了数据库连接设置、事务管理、缓存策略以及其他关键参数。在这个文件中,可以看到关于数据库连接的配置,如: - `connection.driver_class` 指定用于...
Hibernate的二级缓存将不同类型的实体分开存储,这有助于优化性能和内存管理: - **单个实体**:每个单独的实体对象会被独立地存储。 - **集合**:包括List、Set等集合类型的实体。 - **有自然主键的实体**:这类...
在深入探讨Hibernate学习笔记第三天的源码之前,先让我们简单了解一下Hibernate。Hibernate是一个开源的对象关系映射(ORM)框架,它为Java开发者提供了一种方便的方式来管理数据库操作。通过Hibernate,开发人员...
Transaction管理事务;Query则用于执行SQL查询的面向对象封装。 二、对象-关系映射 1. 映射文件(Hibernate.cfg.xml):配置数据库连接信息,如URL、用户名、密码等。 2. 实体类(Entity):表示数据库中的表,通过...
### Hibernate学习笔记知识点详解 #### 一、主配置文件解析 **1.1 配置文件结构** 在提供的配置文件中,我们首先看到的是主配置文件的声明与DTD定义,这是标准的XML文档声明和DTD定义,用于指定文档类型及版本。 ...
- **第一级缓存**:也称为Session缓存,是Hibernate内置并自动管理的缓存。每当Session开启,就会创建一个与之关联的第一级缓存。此缓存用于存储当前Session中的所有持久化对象,以及在事务过程中对这些对象的任何...
这个“HibernateGossip”学习笔记可能是对 Hibernate 3 版本的详细教程,涵盖了核心概念、配置、实体映射、查询以及事务管理等多个方面。 **核心概念** 1. **实体(Entities)**: 实体是 Hibernate 中对应数据库表...
【hibernate学习笔记】 在Java开发中,Hibernate是一个非常重要的ORM(对象关系映射)框架,它使得Java程序员能够更方便地将程序中的对象与关系数据库进行交互,避免了传统JDBC编程的繁琐和低效。这篇学习笔记将带...
4. **Hibernate缓存配置**:在Hibernate中,可以启用二级缓存,通过`hibernate.cache.provider_class`配置EhCache提供者,以及开启查询缓存`hibernate.cache.use_query_cache`。这样,查询结果可以被缓存,减少...
### Java常用框架学习笔记 #### Hibernate ##### 1.1 Hibernate 实现数据库操作步骤 - **导入所需的Jar包**:为了使用Hibernate框架,首先需要在项目中导入Hibernate库。这通常意味着添加一系列与Hibernate相关的...
SSH(Struts+Spring+Hibernate)是一个经典的Java Web开发框架,它将MVC设计模式、依赖注入和持久层管理完美地结合在一起。在SSH框架中,Hibernate作为持久层的解决方案,提供了强大的对象关系映射(ORM)功能。而二...
总而言之,这个“Spring学习笔记”可能涵盖了Spring框架的基础概念、核心组件、Web开发、数据库操作、事务管理、AOP和Spring Boot等方面的内容,通过代码示例帮助读者深入理解并实践Spring开发。对于希望提升Spring...
11. **框架应用**:Spring、Struts、Hibernate等框架简化了JavaWeb开发,提供了事务管理、AOP(面向切面编程)等功能。学习这些框架能提升开发效率,实现更复杂的业务逻辑。 通过学习计算机组成原理和JavaWeb开发,...