如何使用 DB2 数据库执行事务

事务是组合成逻辑工作单元的数据库作组,用于控制和维护每个数据库的一致性和完整性,尽管系统中可能发生错误。 事务由一系列 SQL SELECT、INSERT、UPDATE 或 DELETE 语句组成。 如果在事务期间未发生任何错误,则事务中的所有修改都将成为数据库的永久部分。 如果发生错误,则不会对数据库进行任何修改。

如果事务是单阶段事务,并且由数据库直接处理,则属于本地事务。 当事务监视器协调事务并使用故障安全机制(如两阶段提交)进行事务解析时,事务被视为分布式事务。

注释

事务在服务器上执行时最为有效。 如果您正在使用一个大量使用显式事务的 SQL Server 数据库,应该考虑使用 Transact-SQL BEGIN TRANSACTION 语句,将事务编写为存储过程。

使用MsDb2Connection对象来控制交易。 可以使用 BeginTransaction 方法启动本地事务。 一旦开始事务,可以使用 Transaction 对象的属性在该事务中登记命令 MsDb2Command。 然后,可以根据事务组件的成功或失败,提交或回滚在数据源上进行的修改。

事务有三个基本命令:BEGIN、COMMIT 和 ROLLBACK。 BEGIN 语句标记事务的开头。 在 BEGIN 语句后尝试的所有过程都被视为事务的一部分,该事务由 COMMIT 语句完成,或者由 ROLLBACK 语句取消。

执行事务

  1. 调用 MsDb2Connection.BeginTransaction 以标记事务的开始。

    BeginTransaction 返回对事务的引用。 保留此引用,以便你可以将其分配给事务中登记的命令。

  2. 将事务分配给 MsDb2Command.Transaction 执行。

    在带有活动事务的连接上如果执行命令,并且 Transaction 对象尚未分配给 Command 对象的 Transaction 属性,则会引发一个 MsDb2Exception 异常。

  3. 执行所需的命令。

  4. 调用 MsDb2Transaction.Commit 以完成事务,或调用 MsDb2Transaction.Rollback 取消事务。

    如果在 CommitRollback 方法执行之前连接关闭或断开,事务将回滚。

    下面的代码示例演示如何执行事务。

static void TransactionConnection()  
{  
    MsDb2Connection myConnection new MsDb2Connection(@"file name=HOST.udl ");  
    myConnection.Open();  
    // Start a local transaction.  
    MsDb2Transaction myTrans = myConnection.BeginTransaction();  
    // Enlist the command in the current transaction.  
    MsDb2Command myCommand = myConnection.CreateCommand();  
    myCommand.Transaction = myTrans;  
    try  
    {  
        myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (100, 'Description')";  
        myCommand.ExecuteNonQuery();  
        myCommand.CommandText = "Insert into Region (RegionID, RegionDescription) VALUES (101, 'Description')";  
        myCommand.ExecuteNonQuery();  
        myTrans.Commit();  
        Console.WriteLine("Both records are written to database.");  
    }  
    catch(Exception e)  
    {  
        try  
        {  
           myTrans.Rollback();  
        }  
        catch (MsDb2Exception ex)  
        {  
            if (myTrans.Connection != null)  
            {  
                Console.WriteLine("An exception of type " + ex.GetType() +  
                    " was encountered while attempting to roll back the transaction.");  
            }  
        }  
  
        Console.WriteLine("An exception of type " + e.GetType() +  
            "was encountered while inserting the data.");  
        Console.WriteLine("Neither record was written to database.");  
    }  
    finally  
    {  
        Console.ReadLine();  
        myConnection.Close();  
    }  
}   
// End TransactionConnection  
  

另请参阅

使用 DB2 的托管提供程序