Java 基础之事务详细介绍

发布时间 - 2026-01-11 00:11:25    点击率:

java 事务详解

一、什么是事务

  事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取。事务的正确执行使得数据库从一种状态转换成另一种状态。

   事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)的缩写事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)的缩写。

 原子性。即不可分割性,事务要么全部被执行,要么就全部不被执行。如果事务的所有子事务全部提交成功,则所有的数据库操作被提交,数据库状态发生转换;如果有子事务失败,则其他子事务的数据库操作被回滚,即数据库回到事务执行前的状态,不会发生状态转换。

 一致性或可串性。事务的执行使得数据库从一种正确状态转换成另一种正确状态。
隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务,即在事务正确提交之前,它可能的结果不应显示给任何其他事务。

持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。   

  运行嵌入式SQL应用程序或脚本,在可执行SQL语句第一次执行时(在建立与数据库的连接之后或在现有事务终止之后),事务就会自动启动。在启动事务之后,必须由启动事务的用户或应用程序显式地终止它,除非使用了称为自动提交(automatic commit)的过程(在这种情况下,发出的每个单独的SQL语句被看做单个事务,它一执行就被隐式地提交了)。

  在大多数情况下,通过执行COMMIT或ROLLBACK语句来终止事务。当执行COMMIT语句时,自从事务启动以来对数据库所做的一切更改就成为永久性的了-- 即它们被写到磁盘。当执行ROLLBACK语句时,自从事务启动以来对数据库所做的一切更改都被撤销,并且数据库返回到事务开始之前所处的状态。不管是哪种情况,数据库在事务完成时都保证能回到一致状态。

  一定要注意一点:虽然事务通过确保对数据的更改仅在事务被成功提交之后才成为永久性的,从而提供了一般的数据库一致性,但还是须要用户或应用程序来确保每个事务中执行的SQL操作序列始终会导致一致的数据库。

二、数据库系统支持两种事务模式:

自动提交模式:每个SQL语句都是一个独立的事务,当数据库系统执行完一个SQL语句后,会自动提交事务。
手动提交模式:必须由数据库客户程序显示指定事务开始边界和结束边界。

  注:MySQL中数据库表分为3种类型:INNODB、BDB和MyISAM,其中MyISAM不支持数据库事务。MySQL中create table 语句默认为MyISAM类型。 

三、对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题,这些并发问题可归纳为以下几类:

  • 第一类丢失更新:撤销一个事务时,把其他事务已提交的更新数据覆盖。 
  • 脏读:一个事务读到另一个事务为提交的更新数据。
  • 虚读:一个事务读到另一个事务已提交的新插入的数据。
  • 不可重复读:一个事务读到另一个事务已提交的更新数据。
  • 第二类丢失更新:这是不可重复读中的特例,一个事务覆盖另一个事务已提交的更新数据。  

四、隔离级别

  当数据库系统采用read Commited隔离级别时,会导致不可重复读喝第二类丢失更新的并发问题,可以在应用程序中采用悲观锁或乐观锁来避免这类问题。从应用程序的角度,锁可以分为以下几类:

  1. Serializable(串行化):一个事务在执行过程中完全看不到其他事务对数据库所做的更新。
  2. Repeatable Read(可重复读):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,但是不能看到其他事务对已有记录的更新。
  3. Read Commited(读已提交数据):一个事务在执行过程中可以看到其他事务已经提交的新插入的记录,而且能看到其他事务已经提交的对已有记录的更新
  4. Read Uncomitted(读未提交数据):一个事务在执行过程中可以拷打其他事务没有提交的新插入的记录,而且能看到其他事务没有提交的对已有记录的更新。

    隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以有优先考虑把数据库系统的隔离级别设为Read Commited,它能够避免脏读,而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。

  当数据库系统采用read Commited隔离级别时,会导致不可重复读喝第二类丢失更新的并发问题,可以在应用程序中采用悲观锁或乐观锁来避免这类问题。从应用程序的角度,锁可以分为以下几类:

  A.悲观锁:指在应用程序中显示的为数据资源加锁。尽管能防止丢失更新和不可重复读这类并发问题,但是它会影响并发性能,因此应该谨慎地使用。

  B.乐观锁:乐观锁假定当前事务操作数据资源时,不回有其他事务同时访问该数据资源,因此完全依靠数据库的隔离级别来自动管理锁的工作。应用程序采用版本控制手段来避免可能出现的并发问题。

五、悲观锁有两种实现方式。

  A.在应用程序中显示指定采用数据库系统的独占所来锁定数据资源。SQL语句:select ... for update,在hibernate中使用get,load时如session.get(Account.class,new Long(1),LockMode,UPGRADE)

  B.在数据库表中增加一个表明记录状态的LOCK字段,当它取值为“Y”时,表示该记录已经被某个事务锁定,如果为“N”,表明该记录处于空闲状态,事务可以访问它。增加锁标记字段就可以实现。

  利用Hibernate的版本控制来实现乐观锁

  乐观锁是由程序提供的一种机制,这种机制既能保证多个事务并发访问数据,又能防止第二类丢失更新问题。

  在应用程序中可以利用Hibernate提供的版本控制功能来视线乐观锁,OR映射文件中的<version>元素和<timestamp>都具有版本控制的功能,一般推荐采用<version>

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# java  # 事务  # 事务详解  # 事务理解  # Java事务管理学习之JDBC详解  # Java事务的个人理解小结  # Java事务管理学习之Hibernate详解  # 应用程序  # 这类  # 第二类  # 已有  # 过程中  # 数据库系统  # 所做  # 就会  # 读到  # 多个  # 可以看到  # 以下几类  # 新和  # 它会  # 转换成  # 可能出现  # 数据库中  # 可以分为  # 都是  # 这是 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何配置Horizon来管理队列?(安装和使用)  黑客如何利用漏洞与弱口令入侵网站服务器?  网站制作大概多少钱一个,做一个平台网站大概多少钱?  南京网站制作费用,南京远驱官方网站?  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  Python制作简易注册登录系统  手机软键盘弹出时影响布局的解决方法  如何在VPS电脑上快速搭建网站?  油猴 教程,油猴搜脚本为什么会网页无法显示?  千库网官网入口推荐 千库网设计创意平台入口  零服务器AI建站解决方案:快速部署与云端平台低成本实践  Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析  MySQL查询结果复制到新表的方法(更新、插入)  Laravel怎么实现模型属性的自动加密  如何在宝塔面板创建新站点?  Laravel API资源类怎么用_Laravel API Resource数据转换  Laravel如何编写单元测试和功能测试?(PHPUnit示例)  如何在建站宝盒中设置产品搜索功能?  微信小程序 scroll-view组件实现列表页实例代码  PythonWeb开发入门教程_Flask快速构建Web应用  Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】  详解jQuery中的事件  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  大同网页,大同瑞慈医院官网?  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  如何在Tomcat中配置并部署网站项目?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  如何彻底卸载建站之星软件?  Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  ChatGPT回答中断怎么办 引导AI继续输出完整内容的方法  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  Windows10电脑怎么设置虚拟光驱_Win10右键装载ISO镜像文件  详解Oracle修改字段类型方法总结  UC浏览器如何设置启动页 UC浏览器启动页设置方法  高防服务器如何保障网站安全无虞?  如何在建站之星网店版论坛获取技术支持?  免费网站制作appp,免费制作app哪个平台好?  JS去除重复并统计数量的实现方法  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  制作企业网站建设方案,怎样建设一个公司网站?  javascript事件捕获机制【深入分析IE和DOM中的事件模型】  如何用5美元大硬盘VPS安全高效搭建个人网站?  Laravel怎么实现软删除SoftDeletes_Laravel模型回收站功能与数据恢复【步骤】  php读取心率传感器数据怎么弄_php获取max30100的心率值【指南】  为什么要用作用域操作符_php中访问类常量与静态属性的优势【解答】