数据库事务:事务是指一组相互依赖的操作行为,如银行交易、股票交易或网上购物。事务的成功取决于这些相互依赖的操作行为是否都能执行成功,只要有一个操作行为失败,就意味着整个事务失败。关于事务的一个经典例子就是:A到银行办理转账事务,把100元钱转到B的账号上,这个事务包含以下操作行为:
(1)从A的账户上减去100元。
(2)往B的账户上增加100元。
显然,以上两个操作必须作为一个不可分割的工作单元。假如仅仅第一步操作执行成功,使得Tom的账户上扣除了100元,但是第二步操作执行失败,Jack的账户上没有增加100元,那么整个事务失败。数据库事务是对现实生活中事务的模拟,它由一组在业务逻辑上相互依赖的SQL语句组成。
下面我们一起来看一下数据库事务的生命周期:
这个数据库事务的生命周期图反应出数据库事务的三个边界:
1.事务的开始边界。
2.事务的正常结束边界(COMMIT):提交事务,永久保存被事务更新后的数据库状态。
3.事务的异常结束边界(ROLLBACK):撤销事务,使数据库退回到执行事务前的初始状态。
其实每个数据库连接都有个全局变量@@autocommit,表示当前的事务模式,它有两个可选值:0:表示手工提交模式。1:默认值,表示自动提交模式。
在自动提交模式下,每个SQL语句都是一个独立的事务。也就是说,每执行一条sql语句,数据库都会自动提交这个事务,当我们用数据库另一个客户端去查询的时候,我们可以看到这个新修改或插入的数据。在手工提交模式下,必须显式指定事务开始边界和结束边界:
–事务的开始边界:begin
–提交事务:commit
–撤销事务:rollback
下面我们来看一下通过JDBCAPI是如何声明事务边界的:
Connection提供了以下用于控制事务的方法:
1.setAutoCommit(booleanautoCommit):设置是否自动提交事务
2.commit():提交事务
3.rollback():撤销事务
下面我们看一下具体的应用示例:
看到上边的示例我们可以看出,其实hibernate事务边界就是模仿者JDBC的事务边界来的,其实在hibernate底层的事务管理就是利用的JDBC的事务管理。我们来看一下hibernate事务边界:
1.声明事务的开始边界:
Transactiontx=session.beginTransaction();
2.提交事务:tx.commit();
3.撤销事务:tx.rollback();
我们在学习JDBC数据库事务管理的时候,重点也是难点的学习了jdbc多个事务并发问题。既然hibernate底层是用JDBC事务管理实现的,那么它也一定存在着多个事务并发的问题。下面我们就具体来看一下:hibernate多个事务并发的并发问题:
•第一类丢失更新:撤销一个事务时,把其他事务已提交的更新数据覆盖。
•脏读:一个事务读到另一事务未提交的更新数据。
•虚读:一个事务读到另一事务已提交的新插入的数据。
•不可重复读:一个事务读到另一事务已提交的更新数据。
•第二类丢失更新:这是不可重复读中的特例,一个事务覆盖另一事务已提交的更新数据。
下面我们就脏读来举一个示例:
取款事务在T5时刻把存款余额改为900元,支票转账事务在T6时刻查询账户的存款余额为900元,取款事务在T7时刻被撤销,支票转账事务在T8时刻把存款余额改为1000元。由于支票转账事务查询到了取款事务未提交的更新数据,并且在这个查询结果的基础上进行更新操作,如果取款事务最后被撤销,会导致银行客户损失100元。
事务隔离级别
关于事务隔离级别,我们来看一下下面的两个图解:
由上图可以看出:隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为ReadCommitted,它能够避免脏读,而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。
下面我们就具体来看一下hibernate怎么来配置隔离级别:在Hibernate的配置文件中可以显式的设置隔离级别。每一种隔离级别都对应一个整数:
1:ReadUncommitted
2:ReadCommitted
4:RepeatableRead
8:Serializable
例如,以下代码把hibernate.cfg.xml文件中的隔离级别设为ReadCommitted:
hibernate.connection.isolation=2
对于从数据库连接池中获得的每个连接,Hibernate都会把它改为使用ReadCommitted隔离级别。
分享到:
相关推荐
java程序员-从笨鸟到菜鸟.pdf
### Java程序员成长之路——从菜鸟到笨鸟 #### 一、引言 《Java程序员由菜鸟到笨鸟》是一本由曹胜欢编写的书籍,旨在帮助初学者掌握Java编程的基础知识,并逐步进阶至更高级的应用场景。本书不仅适合初学者作为...
曹胜欢在《JAVA程序员 从笨鸟到菜鸟.pdf》中分享了他个人学习Java的经历,从迷茫到逐渐成长的过程。他强调了自学的重要性,并鼓励初学者不要怕走弯路,同时希望自己的经验可以帮助到同样在学习Java的初学者。 2. ...
### Java程序员从笨鸟到菜鸟 #### 一、开发环境搭建与基本语法 ##### 开发环境搭建 在开始Java的学习之前,首先需要搭建一个合适的开发环境。这通常涉及到以下步骤: 1. **JDK(Java Development Kit)安装**:...
Java程序员的成长之路是一个充满挑战与探索的过程,从初学者到熟练掌握各项技能,需要系统性的学习和实践。"Java程序员由菜鸟到笨鸟学习文档"就是这样一个旨在帮助初入Java世界的学习者逐步进阶的资源。它覆盖了从...
资源名称:《Java程序员-从笨鸟到菜鸟》PDF 下载资源目录:作者简介:..........................................................................................................................................
根据提供的文件信息,“Java程序员由菜鸟到笨鸟”是一本旨在帮助初学者成长为合格Java开发者的书籍。本书作者为曹胜欢,发布日期为2018年3月19日。下面将从多个角度对本书涉及的重要知识点进行概述。 ### 一、Java...
根据提供的文件信息,“Java程序员由菜鸟到笨鸟”是一本旨在帮助初学者成长为合格Java开发者的书籍。本书作者为曹胜欢,发布日期为2018年3月17日。以下是从该书的标题、描述以及部分可能包含的内容中提炼出的关键...
day07_等待与唤醒案例、线程池、Lambda表达式 day08_File类、递归 day09_字节流、字符流 day10_缓冲流、转换流、序列化流、Files day11_网络编程 day12_函数式接口 day13_Stream流、方法引用 Java基础小节练习题答案
《Java游戏:笨鸟》(也称为FlappyBird)是一款基于Java编程语言开发的简单游戏,旨在帮助初学者更好地理解和掌握Java编程基础。这款游戏的实现涉及了许多Java编程的关键概念和技术,下面将对这些知识点进行详细阐述...