精华内容
下载资源
问答
  • ORACLE数据库事务处理和故障恢复
  • 事务隔离级别:一个事务数据库的修改与并行的另一个事务的隔离程度
  • 只有合法的数据可以被写入数据库,否则事务应该将其回滚到最初 状态。 Isolation(隔离性): 事务允许多个用户对同一个数据进行并发访问,而不破坏数据的正 确性和完整性。同时,并行事务的修改必须与其他并行...
  • Oracle数据库事务详解

    千次阅读 2019-06-16 17:04:43
    事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取。事务的正确执行使得数据库从一种状态转换为另一种状态。 事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致...

    什么是事务
    事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数据库的存取。事务的正确执行使得数据库从一种状态转换为另一种状态。
    事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)的缩写,这四种状态的意思是:
    1、原子性
    一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。
    如果事务的所有子事务全部提交成功,则所有的数据库操作被提交,数据库状态发生变化;如果有子事务失败,则其他子事务的数据库操作被回滚,即数据库回到事务执行前的状态,不会发生状态转换
    2、一致性
    事务的执行使得数据库从一种正确状态转换成另外一种正确状态,一致性与原子性是密切相关的。
    3、隔离性
    一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
    4、持久性
    持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。

    隔离级别
    ACID这4个特征中,最难理解的是隔离性。在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同。4个隔离级别分别是:读未提及(READ_UNCOMMITTED)、读已提交(READ_COMMITTED)、可重复读(REPEATABLE_READ)、顺序读(SERIALIZABLE)。

    1. 读未提及(READ_UNCOMMITTED)
      读未提及,该隔离级别允许脏读取,其隔离级别是最低的。换句话说,如果一个事务正在处理某一数据,并对其进行了更新,但同时尚未完成事务,因此还没有提交事务;而以此同时,允许另一个事务也能够访问该数据。
      脏读示例:
      在事务A和事务B同时执行时可能会出现如下场景:
      在这里插入图片描述
      余额应该为1500元才对。请看T5时间点,事务A此时查询的余额为0,这个数据就是脏数据,他是事务B造成的,很明显是事务没有进行隔离造成的。
    2. 读已提交(READ_COMMITTED)
      读已提交是不同的时候执行的时候只能获取到已经提交的数据。
      这样就不会出现上面的脏读的情况了。
      不可重复读示例
      可是解决了脏读问题,但是还是解决不了可重复读问题。在这里插入图片描述
      事务A其实除了查询两次以外,其它什么事情都没做,结果钱就从1000编程0了,这就是不可重复读的问题。
    3. 可重复读(REPEATABLE_READ)
      可重复读就是保证在事务处理过程中,多次读取同一个数据时,该数据的值和事务开始时刻是一致的。因此该事务级别进制了不可重复读取和脏读,但是有可能出现幻读的数据。
      幻读
      幻读就是指同样的事务操作,在前后两个时间段内执行对同一个数据项的读取,可能出现不一致的结果。
      在这里插入图片描述
      银行工作人员在一个事务中多次统计总存款时看到结果不一样。如果要解决幻读,那只能使用顺序读了。
    4. 顺序读(SERIALIZABLE)
      顺序读是最严格的事务隔离级别。它要求所有的事务排队顺序执行,即事务只能一个接一个地处理,不能并发。
      事务隔离级别对比事务隔离级别 脏 读 不可重复读 幻 读读未提及(READ_UNCOMMITTED) 允许 允许 允许读已提交(READ_COMMITTED) 禁止 允许 允许可重复读(REPEATABLE_READ) 禁止 禁止 允许顺序读(SERIALIZABLE) 禁止 禁止 禁止

    注意:
    4种事务隔离级别从上往下,级别越高,并发性越差,安全性就越来越高。
    一般数据默认级别是读以提交或可重复读。

    资料参考:https://www.jianshu.com/p/aa35c8703d61

    mysql事物的4种隔离级别:
    https://www.cnblogs.com/snsdzjlz320/p/5761387.html

    展开全文
  • 介绍了在 .NET 程序中使用数据库事务。如何创建 OracleTransaction 对象并用它们将事务提交给数据库,如何使用保存点部分回滚一个事务,以及 Oracle 数据库如何分离并发事务。同时分别提供了vb.net和c#两种开发工具...
  • 在 .NET 中使用 oracle 数据库 事务提交,事务保存点 注意:ODP.NET 驱动程序针对 oracle 数据库访问进行了优化,因此可以获得最佳性能,并且它们还支持 oracle 数据库的丰富特性,如 BFILE、BLOB、CLOB、XMLType 等...
    在 .NET 中使用 oracle 数据库 事务提交,事务保存点
    注意: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;
    注意:您会在源代码文件 db1.sql 中找到前两个语句和该部分中出现的设置 store 模式的其他语句。

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

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

    Create TABLE product_types (
    product_type_id INTEGER
    CONSTRAINT product_types_pk PRIMARY KEY,
    name VARCHAR2(10) 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 VARCHAR2(30) NOT NULL,
    description VARCHAR2(50),
    price NUMBER(5, 2)
    );
    注意:如果您在一个不同的模式中为 store 用户创建了这些数据库表,那么您将需要修改示例配置文件(您稍后将看到)中的模式名称。

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

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

    Insert INTO product_types (
    product_type_id, name
    ) VALUES (
    1, 'Book'
    );
    Insert INTO product_types (
    product_type_id, name
    ) VALUES (
    2, 'DVD'
    );

    Insert INTO products (
    product_id, product_type_id, name, description, price
    ) VALUES (
    1, 1, 'Modern Science', 'A description of modern science', 19.95
    );
    Insert INTO products (
    product_id, product_type_id, name, description, price
    ) VALUES (
    2, 1, 'Chemistry', 'Introduction to Chemistry', 30.00
    );
    Insert INTO products (
    product_id, product_type_id, name, description, price
    ) VALUES (
    3, 2, 'Supernova', 'A star explodes', 25.99
    );
    Insert INTO products (
    product_id, product_type_id, name, description, price
    ) VALUES (
    4, 2, 'Tank War', 'Action movie about a future war', 13.95
    );

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

    数据库事务简介

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

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

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

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

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

    我现在将带着您逐步完成两个示例程序 — 一个用 C# 编写 (TransExample1.cs),另一个用 VB.NET 编写 (TransExample1.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。示例程序用到了这些类。

    第 1 步

    创建一个 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 属性的设置。

    第 2 步

    创建一个 oracleTransaction 对象,然后调用 oracleConnection 对象的 BeginTransaction() 方法启动事务。

    在 C# 中:

    oracleTransaction myOracleTransaction =
    myOracleConnection.BeginTransaction();
    In VB.NET:

    Dim myOracleTransaction As oracleTransaction = _
    myOracleConnection.BeginTransaction()
    第 3 步

    创建一个 oracleCommand 对象,用于存储 SQL 语句。

    在 C# 中:

    oracleCommand myOracleCommand = myOracleConnection.CreateCommand();
    在 VB.NET 中:

    Dim myOracleCommand As oracleCommand =
    myOracleConnection.CreateCommand
    因为 oracleCommand 对象使用 oracleConnection 对象的 CreateCommand() 方法创建的,所以它自动使用在第 2 步中为 oracleConnection 对象设置的事务。

    第 4 步

    将 oracleCommand 对象的 CommandText 属性设为向表 product_types 中添加一行的第一条 Insert 语句。

    在 C# 中:

    myOracleCommand.CommandText =
    "Insert INTO product_types (" +
    "   product_type_id, name" +
    ") VALUES (" +
    "   3, 'Magazine'" +
       ")";

    在 VB.NET 中:

    myOracleCommand.CommandText = _
    "Insert INTO product_types (" & _
    "   product_type_id, name" & _
    ") VALUES (" & _
    "   3, 'Magazine'" & _
       ")"
    第 5 步

    使用 oracleCommand 对象的 ExecuteNonQuery() 方法运行 Insert 语句。

    在 C# 中:

    myOracleCommand.ExecuteNonQuery();

    在 VB.NET 中:

    myOracleCommand.ExecuteNonQuery()

    第 6 和第 7 步

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

    在 C# 中:


    myOracleCommand.CommandText =
    "Insert INTO products (" +
    "   product_id, product_type_id, name, description, price" +
    ") VALUES (" +
    "   5, 3, 'Oracle Magazine', 'Magazine about oracle', 4.99" +
       ")";
    myOracleCommand.ExecuteNonQuery();
    在 VB.NET 中:

    myOracleCommand.CommandText = _
    "Insert INTO products (" & _
    "   product_id, product_type_id, name, description, price" & _
    ") VALUES (" & _
    "   5, 3, 'Oracle Magazine', 'Magazine about oracle', 4.99" & _
       ")"
    myOracleCommand.ExecuteNonQuery()

    第 8 步

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

    在 C# 中:


    myOracleTransaction.Commit();

    在 VB.NET 中:


    myOracleTransaction.Commit()

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

    第 9 步

    使用 Close() 方法关闭 oracleConnection 对象。

    在 C# 中:


    myOracleConnection.Close();

    在 VB.NET 中:


    myOracleConnection.Close()

    编译并运行示例程序

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



    csc TransExample1.cs /r:C:/oracle/product/10.1.0/
    Client_1/bin/Oracle.DataAccess.dll

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

    如果您遇到以下错误:


    Example1.cs(10,7):error CS0246: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 TransExample1.vb /r:C:/oracle/product/10.1.0/
    Client_1/bin/Oracle.DataAccess.dll /r:system.dll /r:system.data.dll

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


    TransExample1

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


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

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

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

    创建一个新的 C# 控制台应用程序。File>New Project,然后选择 Visual C# Projects,Console Application。
    将项目命名为 TransExample1。
    用 TransExample1.cs 中的代码替换 VS .NET 生成的所有代码。
    选择 Project>Add Reference 添加对 oracle.DataAccess.dll 的引用,然后浏览至您安装 ODP.NET 的目录(在我的计算机上,它是 C:/oracle/product/10.1.0/Client_1/bin/Oracle.DataAccess.dll),然后双击 oracle.DataAccess.dll。
    选择 Debug>Start without Debugging 运行该程序。
    要编译和运行 TransExample1.vb,您可以执行类似的一系列步骤,但第 1 步应选择一个 Visual Basic 控制台应用程序,并在第 3 步用 TransExample1.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 = 5;

    您将看到以下结果:
    PRODUCT_ID PRODUCT_TYPE_ID NAME        NAME
    ---------- --------------- ---------- -----------------------
    DESCRIPTION                                              PRICE
    -------------------------------------------------- ----------
    5                3 Magazine    oracle Magazine
    Magazine about oracle                                     4.99

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

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

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

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

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

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

    第 4 步

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

    在 C# 中:

    myOracleCommand.CommandText =
    "Insert INTO products (" +
    "   product_id, product_type_id, name, description, price" +
    ") VALUES (" +
    "   6, 2, 'Man from Another World', 'Man from Venus lands on Earth', 24.99" +
       ")";
    myOracleCommand.ExecuteNonQuery();

    在 VB.NET 中:

    myOracleCommand.CommandText = _
    "Insert INTO products (" & _
    "   product_id, product_type_id, name, description, price" & _
    ") VALUES (" & _
    "   6, 2, 'Man from Another World', 'Man from Venus lands on Earth', 24.99" & _
       ")"
    myOracleCommand.ExecuteNonQuery()

    第 5 步

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

    在 C# 中:

    myOracleTransaction.Save("SaveProduct");

    在 VB.NET 中:

    myOracleTransaction.Save("SaveProduct")

    第 6 步

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

    在 C# 中:

    myOracleCommand.CommandText =
    "Insert INTO products (" +
    "   product_id, product_type_id, name, description, price" +
    ") VALUES (" +
    "   7, 2, 'Z-Files', 'Mysterious stories', 14.99" +
       ")";
    myOracleCommand.ExecuteNonQuery();

    在 VB.NET 中:

    myOracleCommand.CommandText = _
    "Insert INTO products (" & _
    "   product_id, product_type_id, name, description, price" & _
    ") VALUES (" & _
    "   7, 2, 'Z-Files', 'Mysterious stories', 14.99" & _
       ")"
    myOracleCommand.ExecuteNonQuery()

    第 7 步

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

    在 C# 中:

    myOracleTransaction.Rollback("SaveProduct");

    在 VB.NET 中:

    myOracleTransaction.Rollback("SaveProduct")

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

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

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

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


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

    结论

    在本文中,您系统学习了在 .NET 程序中使用数据库事务。您了解了如何创建 oracleTransaction 对象并用它们将事务提交给数据库,如何使用保存点部分回滚一个事务,以及 oracle 数据库如何分离并发事务。

    展开全文
  • 几乎所有的数据库管理系统中,事务管理的机制都是通过使用日志文件来实现的,我们来简单介绍一下日志的工作方式。 当用户执行一条修改数据库的DML语句时,DBMS自动在日志文件中写一条记录,显示被这条语句影响的每...

    几乎所有的数据库管理系统中,事务管理的机制都是通过使用日志文件来实现的,我们来简单介绍一下日志的工作方式。

    当用户执行一条修改数据库的DML语句时,DBMS自动在日志文件中写一条记录,显示被这条语句影响的每一条记录的两个副本。一个副本显示变化前的记录,另一个副本显示变化后的记录。当日志写完之后,DBMS才实际对磁盘中的记录进行修改。

    如果用户随后执行COMMIT语句,事务结束也被记录在事务日志中。如果用户执行ROLLBACK语句,DBMS检查日志,找出自事务开始以来被修改的记录“以前”的样子,然后使用这些信息恢复它们以前的状态,有效地撤销事务期间对数据库所做的修改。

    如果系统出错,系统操作员通常通过运行DBMS提供的特殊恢复程序来复原数据库。恢复程序检查到事务日志末尾,查找故障之前没有被提交的事务。恢复程序回滚没有完全完成的事务,以便仅有被提交的事务反映到数据库中,而故障中正处理的事务被回滚。

    事务日志的使用明显增加了更新数据库的开销。在实际中,主流商用DBMS产品使用的日志技术比上述描述的方案更复杂,用以减小这种开销。此外,事务日志通常被存储在高速磁盘驱动器中,不同于存储数据库的磁盘,以减小磁盘访问竞争。某些个人计算机DBMS产品允许关闭事务日志性能,以提高DBMS的性能。

     

     

    如上描述如有不懂,可以扫码关注麒琳技术栈公众号,欢迎在线咨询

    展开全文
  • oracle数据库事务并发操作

    万次阅读 2016-08-11 10:58:58
    (2)读“脏”数据(脏读)读“脏”数据是指事务T1修改某一数据,并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被除撤消,而此时T1把已修改过的数据又恢复原值,T2读到的数据与数据库的数据不一致,则T2读到...

    (1)丢失数据修改

    当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题。每个事务都不知道其它事务的存在。最后的更新将重写由其它事务所做的更新,这将导致数据丢失。

    (2)读“脏”数据(脏读)

    读“脏”数据是指事务T1修改某一数据,并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被除撤消,而此时T1把已修改过的数据又恢复原值,T2读到的数据与数据库的数据不一致,则T2读到的数据就为“脏”数据,即不正确的数据。

    (3)不可重复读

    不可重复读(nonrepeatable read)指事务1读取数据后,事务2对数据进行了修改,导致事务1无法再次重现前一次的读取结果。分三种情况,后两种情况称为幻读:
    事务1读取某数据后,事务2对其进行了修改,当事务1再次读取该数据时,得到的值和前一次不同。
    事务1按一定条件读取某数据后,事务2删除了部分记录,当事务1按照相同条件再次读取数据时,发现某些数据消失了。
    事务1按一定条件读取某数据后,事务2增加了部分记录,当事务1按照相同条件再次读取数据时,发现数据增加了。

    展开全文
  • Oracle数据库事务处理和故障恢复

    千次阅读 2006-12-11 14:11:00
    ORACLE数据库事务处理和故障恢复一、并发控制数据库是一个共享资源,可为多个应用程序所共享。这些程序可串行运行,但在许多情况下,由于应用程序涉及的数据量可能很大,常常会涉及输入/输出的交换。为了有效地利用...
  • 数据库--Mysql、Oracle数据库事务及ACID

    千次阅读 2017-09-07 10:06:35
    一、什么是事务? 概念 生活场景 二、事务的四大特性(ACID)? 原子性(Atomic) 一致性(Consistence) 隔离性(Isolation) 持久性(Durability) 三、事务的分类? 隐式事务 显式事务 一、什么是事务...
  • [Oracle Transaction]Oracle数据库事务

    千次阅读 2007-07-09 22:47:00
     1.0摘要本篇主要介绍什么是事务以及对数据库操作时如何控制事务。2.0内容1、 什么是事务2、 事务的控制 1、 什么是事务事务是作为单个逻辑工作单元执行的一系列操作。一个逻辑工作单元必须有四个属
  • 开始事务: OracleTransaction trans = null; OracleCommand comm = null; trans = con.BeginTransaction(); comm = con.CreateCommand(); comm.Trans
  • 一项事务是由一条或是多条表达式所组成的...也就是说,一条对数据库的更新表达式代表一项事务操作。操作成功后,系统将自动调用commit()来提交,否则将调用rollback()来回退。 其次,在JDBC中,可以通过调用setAutoCo
  • 开始事务:OracleTransaction trans = null; OracleCommand comm = null; trans = con.BeginTransaction(); comm = con.CreateCommand(); comm.Transaction = trans;提交:trans.Commit();回滚:trans.Rollback();
  • 88.Oracle数据库SQL开发之 修改表内存——数据库事务的开始和结束.pdf
  • 91.Oracle数据库SQL开发之 修改表内存——数据库事务的并发事务 欢迎转载,转载请标明出处: ORACLE数据库软件支持多个用户同时与数据库进行交互,每个用户都可以同时运行自己的事务。这种事务称为并发事务。  ...
  • 12.15 什么是ORACLE数据库事务(Transactions) 为了有效地控制事务(Transactions),ORACLE引入了两个显式的事务(Transactions)控制命令(语句)。一个是COMMIT,另一个是ROLLBACK。 ORACLE数据库事务...
  • 92.Oracle数据库SQL开发之 修改表内存——数据库事务的事务锁 欢迎转载,转载请标明出处: 要支持并发事务,ORACLE数据库软件必须确保表中的数据一直有效。可以通过锁(lock)来实现。 例如: 1. T1执行给一条...
  • oracle数据库事务

    千次阅读 2018-08-20 15:16:43
    数据库事务是工作的逻辑单元,一个事务由一个或多个完成相关行为的SQL语句组成,通过事务机制保证这一组SQL语句所做的操作要么全部执行执行成功,要不全部不执行 2、事务的ACID特性 原子性(Atomicity):事务的...
  • 关闭Oracle数据库/启动Oracle数据库

    千次阅读 2017-09-10 20:37:24
    SQLPLUS命令连接到Oracle数据库后, SQL> shutdown immediate //执行关闭Oracle数据库命令 ORA-01031: insufficient privileges //执行关闭Oracle数据库命令,出现错误‘权限不足’,即当前登录用户权限...
  • 94.Oracle数据库SQL开发之 修改表内存——数据库事务的SERIALIZABLE事务 欢迎转载,转载请标明出处: 展示事务隔离性级别设置为SERIALIZABLE后的效果。 使用了两个事务:T1和T2。 T1使用默认的隔离性级别READ ...
  • 93.Oracle数据库SQL开发之 修改表内存——数据库事务的事务隔离级别 欢迎转载,转载请标明出处: 事务隔离性级别是一个事务对数据库的修改与并行的另外一个事务的隔离程度。 在两个并发事务T1和T2正在访问相同的行...
  • Oracle管理SQL 和Oracle数据库事务处理的差异性 SQL和Oracle数据库事务处理的差异性 作者:Jake,出处:IT专家网论坛,责任编辑:陈子琪, 2009-10-1113:00 在吉日嘎拉的软件编程走火入魔之数据库事务处理入门(适合...
  • oracle数据库教程

    2021-06-14 10:46:40
    本课程从概念、实战和原理三方面深入的讲解了Oracle数据库的方方面面,课程内容涵盖了Oracle数据库中的绝大部分基础知识,以及高级编程中的常见案例和应用。大家既可以全部学习,掌握整个oracle体系知识,也可以选择...
  • 87.Oracle数据库SQL开发之 修改表内存——数据库事务的提交和回滚 欢迎转载,转载请标明出处: 数据库事务(transaction)就是一组SQL语句,这组SQL语句时一个逻辑工作单元。 要永久性的记录事务中SQL语句的结果,...
  • QT操作Oracle数据库(事务、存储过程)

    千次阅读 2018-10-23 10:44:39
    QT操作Oracle数据库可以使用QODBC、QOCI两种驱动,这里使用QODBC驱动。在使用QOCI驱动操作oracle时,事务不能回滚,可能是我编译的QOCI驱动有问题,但是暂时没有找到原因。 #ifndef QTTEST_H #define QTTEST_H #...
  • 90.Oracle数据库SQL开发之 修改表内存——数据库事务的ACID特性 欢迎转载,转载请标明出处: 事务定义为逻辑工作单元,即一组相关的SQL语句,要么作为一个单位被提交,要么作为一个单位被回滚。数据库理论对事务...
  • 88.Oracle数据库SQL开发之 修改表内存——数据库事务的开始和结束 欢迎转载,转载请标明出处: 事务既有起点,也有终点。 下列之间之一发生,事务开始了: l 连接数据库上,并执行一条DML语句 l 前一个事务结束后...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 187,929
精华内容 75,171
关键字:

oracle数据库事务