在多用户的数据库系统中,都有并发能力,一旦执行了并发,必然导致数据访问冲突。使用事务可以尽量避免并发访问时的冲突,使得数据库的并发访问和性能两方面取得均衡。
不同的厂商在事务处理上有差异,一下针对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"/>
在更新时会比较版本号或者时间戳,如果当前版本号比数据库中的版本号小,则说明是试图提交过期数据而抛出异常。
相关推荐
数据库事务是数据库操作的核心概念,尤其在C#编程中,理解并熟练运用数据库事务对于确保数据的完整性和一致性至关重要。数据库事务确保了在多步骤操作中,如果其中一个步骤失败,整个事务可以被回滚,从而避免了数据...
【Redis 事务与关系型数据库事务的比较】 Redis 和关系型数据库(如 MySQL)在事务处理上有显著的差异。在Redis中,事务提供了一种批量执行命令的方式,以确保原子性,但其机制与传统的ACID(原子性、一致性、隔离...
数据库事务处理是数据库管理系统中的核心概念,用于确保数据的一致性和完整性。事务是数据库操作的基本单元,它包含一组逻辑操作,这些操作要么全部执行,要么全部不执行,以确保数据的原子性。事务处理主要关注两个...
### SQL数据库事务机制详解 #### 事务的基本概念 在数据库管理中,事务是一个非常重要的概念。事务是指作为单个逻辑工作单元执行的一系列操作。它主要用于确保数据在更新过程中的完整性,特别是在同步发生的多步...
数据库事务是数据库操作的核心概念,它是数据库管理系统执行过程中的一个逻辑工作单位,包含了对数据库的一系列操作。在数据库系统中,事务确保数据的一致性和完整性,使得即使在系统出现故障或者并发操作的情况下,...
java代码-使用java解决数据库事务处理的源代码 ——学习参考资料:仅用于个人学习使用!
数据库事务:对数据库事务的讲解,事务的概念 理解事务的特性、分类
分布式数据库事务处理是数据库系统中的一个重要概念,尤其是在大型企业级应用和互联网服务中,它能够保证数据的一致性和完整性,即使在多台计算机之间进行数据操作。COM+(Component Object Model Plus)是微软提出...
### 数据库事务应用详解 #### 事务处理的重要性与ACID特性 事务处理是现代数据库管理系统(DBMS)中不可或缺的一部分,尤其对于那些涉及复杂业务逻辑、需要确保数据一致性和完整性的应用来说更是如此。事务处理的...
共计132页的ppt,详细讲述数据库事务处理技术
在VC 6.0程序中执行数据库事务的一个范例,是一个数据库的高级应用例子,关于设置ADO控件,方法如下: (1)在程序中选择ResourceView视图,打开“Dialog”节点下的“IDD_AFFAIR_DIALOG”对话框资源,右键单击ADO ...
数据库事务管理及锁机制原理剖析:包括事务特性 ACID、数据隔离级别、事务实现的原理、锁机制,及过程中可能遇到的查询效率及死锁问题等
### DB2数据库事务日志详解及处理方法 #### 一、引言 在数据库管理领域,尤其是对于IBM DB2这样的大型关系型数据库管理系统而言,事务日志管理是至关重要的环节之一。事务日志用于记录数据库中的所有事务操作,确保...
本文将深入探讨C#语言中与数据库事务相关的原理及实践,包括事务的定义、特性、类型,以及如何在C#中利用Entity Framework(EF)进行事务开发和管理。 首先,我们需要理解什么是事务。在数据库系统中,事务是一组...
数据库事务在项目中的应用.mp4
"数据库基础数据库事务处理" 数据库事务处理是数据库系统的基本概念,允许用户对数据进行更改,然后决定是保存还是放弃所做的更改。事务处理是一个不可分割的工作单位,多个步骤绑定在一起形成一个逻辑操作,包含...
数据库事务日志是数据库管理系统中一个至关重要的组成部分,它记录了数据库中所有事务的详细操作记录。这些日志对于确保数据库的一致性、持久性和可恢复性至关重要。本文将详细探讨数据库事务日志的概念、作用、实现...
数据库事务管理是数据库系统中确保数据一致性的重要机制。在数据库环境中,事务是一个逻辑工作单元,它包含了一系列数据库操作,这些操作要么全部执行,要么全部不执行。事务是动态的,与静止的程序不同,它是程序...