深入探讨数据库事务类型 (数据库事务类型)

随着互联网的发展和计算机技术的不断升级,数据库已经成为了数据存储和管理的核心工具。在数据库的应用中,事务处理是非常重要的一个环节。事务是指基于数据库之上的一系列操作,它要么全部被执行,要么全部不被执行,这个过程称为事务。本文将,包括事务的定义、特点和分类等内容。

一、事务的定义

数据库事务是具有原子性、一致性、隔离性和持久性等特性的一组操作,被视为一个单元进行执行。

1. 原子性

事务是原子性的,意味着事务中的所有操作,要么全部执行成功,要么全部执行失败。即使其中一项操作失败,整个事务也会被视为失败,所有的操作会被回退。

2. 一致性

事务执行结束后,系统应该保证数据的一致性。这意味着事务在执行过程中,数据可以被多次修改,但最终数据的状态必须是符合一定规则的。

3. 隔离性

事务之间应该是相互隔离的,一个事务的执行不应该影响到其他事务的执行结果。这可以保证事务的并发性和安全性。

4. 持久性

事务在提交之后,对数据的修改应该被持久化保存到数据库中,并且不可被回滚。这可以保证事务的结果不会被意外地破坏。

二、事务的特点

对于事务,有以下几个特点:

1. 原子性

事务具有原子性,意味着它可以被看成一个不可分割的整体。

2. 一致性

事务执行的结果必须是符合一定规则的,否则事务将会被回滚。

3. 隔离性

事务之间应该是相互隔离的,以保证并发执行的正确性和安全性。

4. 持久性

事务一旦提交,数据修改的效果应该被持久化保存在数据库中。

三、事务的分类

根据Oracle官方数据库指南,事务可以分为以下几种类型:

1. 用户事务

通常是由用户直接触发的事务,涉及对单个或多个表的操作。

2. 系统事务

由数据库引擎自行触发的事务,如空间管理、资源管理等。

3. 隐含事务

在DML(Data Manipulation Language,数据操作语言)语句执行时引发的隐含事务,例如INSERT、DELETE、UPDATE等等。

4. 显式事务

由应用程序显式地定义和执行的事务,例如BEGIN、COMMIT和ROLLBACK语句等等。

5. 本地事务

在一个数据库实例内执行的事务。

6. 全局事务

在多个数据库实例间执行的事务。

四、事务的应用

在实际应用中,数据库的事务处理是非常重要的。在银行、电商、等领域,数据的安全性和一致性是至关重要的。对于企业级应用来说,事务处理的数据量和并发性非常高,因此如何优化事务处理的效率和可靠性,具有极大的意义。

1. 提高事务处理能力

使用合适的数据库引擎,提高事务处理效率和可靠性,是企业级应用所必须具备的能力。

2. 提高事务处理并发性

通过并发控制机制,克服多个事务之间的相互干扰,提高了事务处理的并发性和安全性。

3. 降低数据异常风险

通过正确处理事务分离、隔离等问题,得到了更好的数据保障,降低了数据异常风险。

数据库事务是数据管理的重要环节,具有原子性、一致性、隔离性和持久性等特点,对于企业级应用具有至关重要的作用。对于事务的理解和应用,在数据库的设计和优化中起到了重要作用。

相关问题拓展阅读:

数据库故障分为哪几种类型?

数据库运行过程中常见的故障有3类:事物故障、系统故障、介质故障。

恢复策略:

1、事物故障:

发生事务故障时,被迫中断的事务可能已对数据库进行丁修改,为了消除该事务对数据库的影响,要利用日志文件中所记载的信息,强行回滚该事务,将数据库恢复到修改前的初始状态。

为此,要检查日志文件中由这些事务所引起的发生变化的记录,取消这些没有完成的事务所做的一切改变,这类恢复操作称为事务撤销。

2、系统故障:

系统故障的恢复要完成两方面的工作,既要撤销所有末完成的事务,还要重做所有已提交的事务,这样才能将数据库真正恢复到一致的状态。

3、介质故障:

介质故障比事务故障和系统故障发生的可能性要小,但这是最严重的一种故障,破坏性很大,磁盘上的物理数据和日志文件可能被破坏,这需要装入发生介肢纯质故障前最新的后备数据库副本,然后利用日志文件重做该副本后所运行的所有事务。

扩展资料:

“数据故障恢复”和“完整性约束”、“并发控制”一样,都是数据库数据保护机制中的一种完整性控制。所有的系统都免不了会发生故障,有可能是硬件失灵,有可能是软件系统崩溃,也有可能是其他外界的原因,比如断电等等。

数据库运行的突然中断会使数据库处在一个错误的状态局饥雀,而且故障排除后没有办法让系统精确地从断点继续执行下去。这就要求DBMS要有一套故障后的数据恢复机构,保证数桐早据库能够回复到一致的、正确地状态去。

参考资料来源:

百度百科-事务故障

参考资料来源:

百度百科-系统故障

参考资料来源:

百度百科-介质故障

在.NET中使用Oracle数据库事务

在本文中 您将了解到如何在 Visual Basic NET (VB NET) 和 Visual C# NET (C#) 中使用数据库事务 具体来讲 您将系统学习数据库事务 在 NET 程序中使用 OracleTransaction 对象以及如何设置事务保存点 本文中引用的所有脚本和文件都在这里提供 本文假定您大体上熟悉 C# 和 VB NET 编程

  

所需软件

  如果您要跟随我们逐步完成本文中给出的示例 那么您需要安装以下软件

  Windows NT Windows Windows XP Professional 或 Windows Server

  能够访问一个已安装的 Oracle 数据库(Oracle i 版本 或更高版本)

  Oracle 客户机(版本 或更高版本)

  Oracle Net(版本 或更高版本)

  Oracle Data Providers for NET(版本 或更高版本)

  Microsoft NET Framework(版本 或更高版本)

  Microsoft NET 框架 SDK(版本 或更高版本)

  如果您打算使用企业服务事务或分布式事务来开发和运行应用程序 那么您还需要安装 Oracle Services for Microsoft Transaction Server( 或更高版本)

  您需要分别下载和安装 NET 框架以及 SDK(先安装框架) 您还需要下载和安装 Oracle 数据库 g 它包括 Oracle Data Provider for NET (ODP NET) 您可以选择在不同计算机清改或同一计算机上安装 ODP NET 和数据库服务器

  注意 ODP NET 驱动程序针对 Oracle 数据库访问进行了优化 因此可以获得更佳性能 并且它们还支持 Oracle 数据库的丰富特性 如 BFILE BLOB CLOB XMLType 等 如果您正在开发基于 Oracle 数据库的 NET 应用程序 那么就特性和性能来讲搭芦 ODP NET 无疑是更佳的选择

  

数据库模式设置

  首先 您需要设置数据库模式 在此我们使用一个简化的 Web 商店示例 您必须首先创建一个名为 store 的用户并按以下方式将所需的权限授予该用户(您必须首先以拥有 CREATE USER 权限的用户身份登录数据库才能创建用户)

  CREATE USER store IDENTIFIED BY store;  GRANT connect resource TO store;

  注意 您会在源代码文件 db sql 中找到前两个语句和该部分中出现的设置 store 模式的其他语句

  接下的语句以 store 用户身份进行连接

  CONNECT store/store;

  以下语句创建了所需的两个数据库表 名称分别为 product_types 和 products

  CREATE TABLE product_types (  product_type_id INTEGER  CONSTRAINT product_types_pk PRIMARY KEY   name VARCHAR ( ) NOT NULL  );

  CREATE TABLE products (  product_id INTEGER  CONSTRAINT products_pk PRIMARY KEY   product_type_id INTEGER  CONSTRAINT products_fk_product_types  REFERENCES product_types(product_type_id)   name VARCHAR ( ) NOT NULL   description VARCHAR ( )   price NUMBER( )  );

  注意 如果您在一个知正带不同的模式中为 store 用户创建了这些数据库表 那么您将需要修改示例配置文件(您稍后将看到)中的模式名称

  表 product_types 用于存储示例在线商店可能库存的产品类型的名称 表 products 包含了所销售产品的详细信息

  下面的 INSERT 语句为表 product_types 和 products 添加行

  INSERT INTO product_types (  product_type_id name  ) VALUES (   Book   );  INSERT INTO product_types (  product_type_id name  ) VALUES (   DVD   );

  INSERT INTO products (  product_id product_type_id name description price  ) VALUES (   Modern Science A description of modern science   );  INSERT INTO products (  product_id product_type_id name description price  ) VALUES (   Chemistry Introduction to Chemistry   );  INSERT INTO products (  product_id product_type_id name description price  ) VALUES (   Supernova A star explodes   );  INSERT INTO products (  product_id product_type_id name description price  ) VALUES (   Tank War Action movie about a future war   );

  MIT;

  接下来 您将了解有关数据库事务的内容

  

数据库事务简介

  数据库事务是由一组 SQL 语句组成的一个逻辑工作单元 您可以把事务看作是一组不可分的 SQL 语句 这些语句作为一个整体永久记录在数据库中或一并撤销 比如在银行帐户之间转移资金 一条 UPDATE 语句将从一个帐户的资金总数中减去一部分 另一条 UPDATE 语句将把资金加到另一个帐户中 减操作和加操作必须永久记录在数据库中 或者必须一并撤销 ― 否则将损失资金 这个简单的示例仅使用了两条 UPDATE 语句 但一个更实际的事务可能包含许多 INSERT UPDATE 和 DELETE 语句

  要永久记录一个事务中的 SQL 语句的结果 您可以通过 MIT 语句来执行提交 要撤销 SQL 语句的结果 您可以使用 ROLLBACK 语句来执行回滚 这会把所有的行重设为它们原来的状态 只要您事先没有与数据库断开 则您在执行回滚之前所做的任何修改都将被撤销 您还可以设置一个保存点 以便将事务回滚至该特定的点 同时保持事务中的其他语句原封不动

  

在 C# 和 VB NET 中使用数据库事务

  您可以使用 OracleTransaction 类的一个对象来表示一个事务 OracleTransaction 类包含多个属性 其中的两个为 Connection(指定与事务关联的数据库连接)和 IsolationLevel(指定事务隔离级别) 本文稍后将向您介绍更多有关事务隔离级别的内容

  OracleTransaction 类包含许多操控事务的方法 您可以使用 Commit() 方法永久提交 SQL 语句 并可以使用 Rollback() 撤销这些语句 您还可以使用 Save() 在事务中设置一个保存点

  我现在将带着您逐步完成两个示例程序 ― 一个用 C# 编写 (TransExample cs) 另一个用 VB NET 编写 (TransExample vb) 这些程序演示了如何执行一个包含了两条 INSERT 语句的事务 之一条 INSERT 语句将在表 product_types 中添加一行 第二条将在表 products 中添加一行

  

导入命名空间

  以下 C# 程序语句指定在程序中使用 System 和 Oracle DataAcess Client 命名空间

  using System;  using Oracle DataAccess Client;

  下面是等价的 VB NET 语句

  Imports System  Imports Oracle DataAccess Client

  Oracle DataAccess Client 命名空间是 ODP NET 的一部分 它包含许多类 其中有 OracleConnection OracleCommand 和 OracleTransaction 示例程序用到了这些类

  第 步

  创建一个 OracleConnection 对象连接到 Oracle 数据库 然后打开该连接

  在 C# 中

  OracleConnection myOracleConnection =  new OracleConnection(   User Id=store;Password=store;Data Source=ORCL     );  myOracleConnection Open();  在 VB NET 中

  Dim myOracleConnection As New OracleConnection( _   User Id=store;Password=store;Data Source=ORCL )  myOracleConnection Open()

  User Id 和 Password 属性指定了您所要连接到的模式的数据库用户和口令 Data Source 属性指定了数据库的 Oracle Net 服务名称 初始数据库的默认服务名称为 ORCL 如果您使用的不是初始数据库 或者您的服务名称不同 那么您需要在程序中修改 Data Source 属性的设置

  第 步

  创建一个 OracleTransaction 对象 然后调用 OracleConnection 对象的 BeginTransaction() 方法启动事务

  在 C# 中

  OracleTransaction myOracleTransaction =  myOracleConnection BeginTransaction();  In VB NET:

  Dim myOracleTransaction As OracleTransaction = _  myOracleConnection BeginTransaction()

  第 步

  创建一个 OracleCommand 对象 用于存储 SQL 语句

  在 C# 中

  OracleCommand myOracleCommand = myOracleConnection CreateCommand();

  在 VB NET 中

  Dim myOracleCommand As OracleCommand =  myOracleConnection CreateCommand

  因为 OracleCommand 对象使用 OracleConnection 对象的 CreateCommand() 方法创建的 所以它自动使用在第 步中为 OracleConnection 对象设置的事务

  第 步

  将 OracleCommand 对象的 CommandText 属性设为向表 product_types 中添加一行的之一条 INSERT 语句

  在 C# 中

  myOracleCommand CommandText =   INSERT INTO product_types ( +     product_type_id name +   ) VALUES ( +     Magazine +    ) ;

  在 VB NET 中

  myOracleCommand CommandText = _   INSERT INTO product_types ( & _     product_type_id name & _   ) VALUES ( & _     Magazine & _    )     第 步

  使用 OracleCommand 对象的 ExecuteNonQuery() 方法运行 INSERT 语句

  在 C# 中

  myOracleCommand ExecuteNonQuery();

  在 VB NET 中

  myOracleCommand ExecuteNonQuery()

  第 和第 步

  将 OracleCommand 对象的 CommandText 属性设为向表 Products 中添加一行的第二条 INSERT 语句 并运行它

  在 C# 中

  myOracleCommand CommandText =   INSERT INTO products ( +     product_id product_type_id name description price +   ) VALUES ( +     Oracle Magazine Magazine about Oracle +    ) ;  myOracleCommand ExecuteNonQuery();

  在 VB NET 中

  myOracleCommand CommandText = _   INSERT INTO products ( & _     product_id product_type_id name description price & _   ) VALUES ( & _     Oracle Magazine Magazine about Oracle & _    )   myOracleCommand ExecuteNonQuery()

  第 步

  使用 OracleTransaction 对象的 Commit() 方法提交数据库中的事务

  在 C# 中

  myOracleTransaction Commit();

  在 VB NET 中

  myOracleTransaction Commit()

  在完成 Commit() 方法之后 由 INSERT 语句添加的两行将在数据库中永久记录

  第 步

  使用 Close() 方法关闭 OracleConnection 对象

  在 C# 中

  myOracleConnection Close();

  在 VB NET 中

  myOracleConnection Close()

  

编译并运行示例程序

  要编译 C# 示例程序 您可以使用 csc 命令运行 C# 编译器 因为程序使用 Oracle Data Access DLL 所以您应使用 /r 选项指定该 DLL 的完整路径 例如

  csc TransExample cs /r:C:\oracle\product\ \  Client_ \bin\Oracle DataAccess dll

  注意 您需要用您计算机上的相应路径来替换该 DLL 的路径 此外 如果您的计算机找不到 csc 编译器 那么您可能需要运行 Microsoft sdkvars bat 脚本来首先设置 NET SDK 的环境变量 您可以在安装 NET SDK 的 bin 目录中找到该脚本

  如果您遇到以下错误

  Example cs( ):error CS :The type or namespace name Oracle   could not be found (are you missing a using directive or an assembly reference?)

  这说明您没有在编译命令中正确指定 Oracle Data Access DLL (有关设置的信息 请参阅 John Paul Cook 的技术文章 在 Oracle 数据库上构建 NET 应用程序 )

  下面是用于编译 VB NET 程序的等价命令

  vbc TransExample vb /r:C:\oracle\product\ \  Client_ \bin\Oracle DataAccess dll /r:system dll /r:system data dll

  接下来 输入以下命令 运行示例

  TransExample

  您将看到程序的输出 不过 如果您遇到类似以下的异常

  An exception was thrown  Message = ORA :TNS:listener does not currently know  of service requested in connect descriptor

  这说明 OracleConnection 对象的连接字符串中的 Data Source 的设置不正确 您应当咨询您的 DBA 或查阅 Oracle Net 文档以获得更多详细信息

  如果您使用的是 VS NET 那么您可以遵循以下指示来编译和运行 C# 程序 TransExample cs

  创建一个新的 C# 控制台应用程序 File>New Project 然后选择 Visual C# Projects Console Application

  将项目命名为 TransExample

  用 TransExample cs 中的代码替换 VS NET 生成的所有代码

  选择 Project>Add Reference 添加对 Oracle DataAccess dll 的引用 然后浏览至您安装 ODP NET 的目录(在我的计算机上 它是 C:\oracle\product\ \Client_ \bin\Oracle DataAccess dll) 然后双击 Oracle DataAccess dll

  选择 Debug>Start without Debugging 运行该程序

  要编译和运行 TransExample vb 您可以执行类似的一系列步骤 但第 步应选择一个 Visual Basic 控制台应用程序 并在第 步用 TransExample vb 中的代码替换生成的代码

  

查看程序的运行结果

  当您运行完 C# 或 VB NET 程序时 您可以在 SQL*Plus 中使用以下 SELECT 语句查看事务的结果

  SELECT p product_id p product_type_id pt name p name p description p price  FROM products p product_types pt  WHERE p product_type_id = pt product_type_id  AND p product_id = ;

  您将看到以下结果

  PRODUCT_ID PRODUCT_TYPE_ID NAMENAME     DESCRIPTION   PRICEMagazine   Oracle Magazine  Magazine about Oracle

  接下来 您将了解如何设置事务保存点

  

在 NET 程序中设置事务保存点

  正如本文前面所提到的那样 您可以设置一个保存点 以便将事务回滚至该特定的点 同时保持事务中的其他语句原封不动 您可以使用 OracleTransaction 类的 Save() 方法在事务中设置保存点

  如果您有一个非常长的事务并且希望能够仅回滚到某个特定的时间点 那么您可能要使用保存点 例如 您可能想对 个产品做一些更改 然后设置一个保存点 然后再对另 个产品做更改 如果您在进行第二批更改时出现了错误 那么您可以回滚至保存点 使您的之一批更改原封不动

  我将带您逐步完成演示如何使用保存点的 C# (TransExample cs) 示例程序和 VB NET (TransExample vb) 示例程序中的相关新步骤 这些程序向表 products 中添加一行 设置一个保存点 向表 products 中添加另一行 回滚至保存点 然后从表 products 中读取这些行 在回滚至保存点后 只有添加到表 products 中的之一行保留了下来 第二行将已被删除

  第 到第 步与 在 C# 和 VB NET 中使用数据库事务 部分中所示的步骤相同 因此在这里将其省略

  第 步

  向表 products 中添加一行 该行的产品 ID 为

  在 C# 中

  myOracleCommand CommandText =   INSERT INTO products ( +     product_id product_type_id name description price +   ) VALUES ( +     Man from Another World Man from Venus lands on Earth +    ) ;  myOracleCommand ExecuteNonQuery();

  在 VB NET 中

  myOracleCommand CommandText = _   INSERT INTO products ( & _     product_id product_type_id name description price & _    ) VALUES ( & _     Man from Another World Man from Venus lands on Earth & _    )   myOracleCommand ExecuteNonQuery()

  第 步

  使用 OracleTransaction 的 Save() 方法设置一个名为 SaveProduct 的保存点

  在 C# 中

  myOracleTransaction Save( SaveProduct );

  在 VB NET 中

  myOracleTransaction Save( SaveProduct )

  第 步

  向表 products 中添加另一行 该行的产品 ID 为

  在 C# 中

  myOracleCommand CommandText =   INSERT INTO products ( +     product_id product_type_id name description price +   ) VALUES ( +     Z Files Mysterious stories +    ) ;  myOracleCommand ExecuteNonQuery();

  在 VB NET 中

  myOracleCommand CommandText = _   INSERT INTO products ( & _     product_id product_type_id name description price & _   ) VALUES ( & _     Z Files Mysterious stories & _    )   myOracleCommand ExecuteNonQuery()

  第 步

  回滚到先前在第 步中设置的 SaveProduct 保存点

  在 C# 中

  myOracleTransaction Rollback( SaveProduct );

  在 VB NET 中

  myOracleTransaction Rollback( SaveProduct )

  完成回滚后 在第 步中添加的第二行已被删除 而在第 步中添加的之一行保留了下来

  TransExample cs 和 TransExample vb 中剩下的步骤显示表 products 的内容 回滚整个事务并从数据库断开

  用于 Microsoft Transaction Server 的 Oracle 事务服务的快速说明

  Microsoft Transaction Server 是一个运行在互联网或网络服务器上的专有事务处理系统 Microsoft Transaction Server 为客户端计算机部署和管理应用程序和数据库事务请求

  Microsoft Transaction Server 是以服务器为中心的三层体系结构模型的一个组件 这种方法实现了将应用程序的表示 业务逻辑和数据元素清晰地分布到在一个网络中连接的不同计算机上 无需专门集成 您就可以在与 Oracle 数据库服务器 版或更高版本连接的 Microsoft Transaction Server 中部署一个组件 但首先您必须安装 Oracle Services for Microsoft Transaction Server

  

结论

lishixinzhi/Article/program/Oracle/202311/18786

数据库事务类型的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于数据库事务类型,深入探讨数据库事务类型,数据库故障分为哪几种类型?,在.NET中使用Oracle数据库事务的信息别忘了在本站进行查找喔。


数据运维技术 » 深入探讨数据库事务类型 (数据库事务类型)