首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

数据库基础之事务处理控制

点击蓝字关注我吧

【本文详细介绍了数据库的基础知识之事务处理控制的基本概念和使用场景,欢迎读者朋友们阅读、转发和收藏!】

1 基本概念

1.1 数据库事务

数据库事务 (Database Transaction) ,是指作为单个逻辑工作单元执行的一系列 操作 ,要么完全地执行,要么完全地不执行。事务处理可以确保除非事务性单元内的所有操作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,必须满足所谓的 ACID (原子性、一致性、隔离性和持久性)属性。事务是数据库运行中的一个逻辑工作单位,由 DBMS 中的事务管理子系统负责事务的处理。

1.2 数据库相关属性

1.2.1 原子性 ( Atomic )( Atomicity)

事务必须是原子工作单元;对于其 数据修改 ,要么全都执行,要么全都不执行。通常,与某个事务关联的操作具有共同的目标,并且是相互依赖的。如果系统只执行这些操作的一个子集,则可能会破坏事务的总体目标。原子性消除了系统处理操作子集的可能性。

1.2.2 一致性 ( Consistent ) (Consistency)

事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。某些维护一致性的责任由应用程序开发人员承担,他们必须确保应用程序已强制所有已知的完整性约束。例如,当开发用于转帐的应用程序时,应避免在转帐过程中任意移动小数点。

1.2.3 隔离性 ( Insulation ) (Isolation)

由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为隔离性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。当事务可序列化时将获得最高的 隔离级别 。在此级别上,从一组可并行执行的事务获得的结果与通过连续运行每个事务所获得的结果相同。由于高度隔离会限制可并行执行的事务数,所以一些应用程序降低隔离级别以换取更大的吞吐量。

1.2.4 持久性 ( Duration ) (Durability )

事务完成之后,它对于系统的影响是永久性的。该修改即使出现致命的系统故障也将一直保持。

1.3 操作流程

设想网上购物的一次交易,其付款过程至少包括以下几步数据库操作:

一、更新客户所购商品的库存信息

二、保存客户付款信息 -- 可能包括与银行系统的交互

三、生成订单并且保存到数据库中

四、更新用户相关信息,例如购物数量等等

正常的情况下,这些操作将顺利进行,最终交易成功,与交易相关的所有数据库信息也成功地更新。但是,如果在这一系列过程中任何一个环节出了差错,例如在更新商品库存信息时发生异常、该顾客银行帐户存款不足等,都将导致交易失败。一旦交易失败,数据库中所有信息都必须保持交易前的状态不变,比如最后一步更新用户信息时失败而导致交易失败,那么必须保证这笔失败的交易不影响数据库的状态 -- 库存信息没有被更新、用户也没有付款,订单也没有生成。否则,数据库的信息将会一片混乱而不可预测。

数据库事务正是用来保证这种情况下交易的平稳性和可预测性的技术。

1.4 使用场景

Java 中使用事务处理,首先要求数据库支持事务。如使用 MySQL 的事务功能,就要求 MySQL 的表类型为 Innodb 。

Java 事务的类型有三种:JDBC 事务、 JTA ( Java Transaction API )事务、容器事务。

1 、 JDBC 事务

JDBC 事务是用 Connection 对象控制的。JDBC Connection 接口( java.sql.Connection )提供了两种事务模式:自动提交和手工提交。java.sql.Connection 提供了以下控制事务的方法:

public void setAutoCommit(boolean)

public boolean getAutoCommit()

public void commit()

public void rollback()

2 、 JTA ( Java Transaction API )事务

JTA 是一种高层的,与实现无关的,与协议无关的 API ,应用程序和应用服务器可以使用 JTA 来访问事务。

JTA 允许应用程序执行分布式事务处理——在两个或多个网络计算机资源上访问并且更新数据,这些数据可以分布在多个数据库上。JDBC 驱动程序的 JTA 支持极大地增强了数据访问能力。

如果计划用 JTA 界定事务,那么就需要有一个实现 javax.sql.XADataSource 、 javax.sql.XAConnection 和 javax.sql.XAResource 接口的 JDBC 驱动程序。一个实现了这些接口的驱动程序将可以参与 JTA 事务。一个 XADataSource 对象就是一个 XAConnection 对象的工厂。XAConnection s 是参与 JTA 事务的 JDBC 连接。

您将需要用应用服务器的管理工具设置 XADataSource . 从应用服务器和 JDBC 驱动程序的文档中可以了解到相关的指导。

J2EE 应用程序用 JNDI 查询数据源。一旦应用程序找到了数据源对象,它就调用

javax.sql.DataSource.getConnection ()以获得到数据库的连接。XA 连接与非 XA 连接不同。一定要记住 XA 连接参与了 JTA 事务。这意味着 XA 连接不支持 JDBC 的自动提交功能。同时,应用程序一定不要对 XA 连接调用

java.sql.Connection.commit () 或者

java.sql.Connection.rollback () . 相反,应用程序应该使用 UserTransaction.begin ()、 UserTransaction.commit ()和 serTransaction.rollback () 。

3 、容器事务

容器事务主要是 J2EE 应用服务器提供的,容器事务大多是基于 JTA 完成,这是一个基于 JNDI 的,相当复杂的 API 实现。相对编码实现 JTA 事务管理,我们可以通过 EJB 容器提供的容器事务管理机制( CMT )完成同一个功能,这项功能由 J2EE 应用服务器提供。这使得我们可以简单的指定将哪个方法加入事务,一旦指定,容器将负责事务管理任务。这是我们的解决方式,因为通过这种方式我们可以将事务代码排除在逻辑编码之外,同时将所有困难交给 J2EE 容器去解决。使用 EJB CMT 的另外一个好处就是程序员无需关心 JTA API 的编码,不过,理论上我们必须使用 EJB。

三种 Java 事务差异

1 、 JDBC 事务控制的局限性在一个数据库连接内,但是其使用简单。

2 、 JTA 事务的功能强大,事务可以跨越多个数据库或多个 DAO ,使用也比较复杂。

3 、容器事务,主要指的是 J2EE 应用服务器提供的事务管理,局限于 EJB 应用使用。

我知道你在看

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200609A0MOB900?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券