导航

执行事务

Posted on 2007-01-22 19:28  小西  阅读(266)  评论(0)    收藏  举报

事务是一组组合成逻辑工作单元的操作,虽然系统中可能会出错,但事务将控制和维护事务中每个操作的一致性和完整性。

例如,在将资金从一个帐户转移到另一个帐户的银行应用中,一个帐户将一定的金额贷记到一个数据库表中,同时另一个帐户将相同的金额借记到另一个数据库表中。由于计算机可能会因停电、网络中断等而出现故障,因此有可能更新了一个表中的行,但没有更新另一个表中的行。如果数据库支持事务,则可以将数据库操作组成一个事务,以防止因这些事件而使数据库出现不一致。如果事务中的某个点发生故障,则所有更新都可以回滚到事务开始之前的状态。如果没有发生故障,则通过以完成状态提交事务来完成更新。

在 ADO.NET 中,可以使用 ConnectionTransaction 对象来控制事务。可以使用 Connection.BeginTransaction 启动本地事务。一旦开始一个事务,就可以使用 Command 对象的 Transaction 属性在该事务中登记命令。然后,可以根据事务组件的成功或失败情况,使用 Transaction 对象提交或回滚在数据源中所做的修改。

还可以使用 Connection.EnlistDistributedTransaction 在现有的分布式事务中登记。在现有的分布式事务中登记可以确保当提交或回滚整个分布式事务时,也提交或回滚对数据源所作的代码修改。

使用 ADO.NET 执行事务

若要执行事务,请执行下列操作:

  1. 调用 Connection 对象的 BeginTransaction 方法来标记事务的开始。BeginTransaction 方法返回对 Transaction 的引用。该引用将分配给登记在事务中的 Command 对象。
  2. 将 Transaction 对象分配给要执行的 Command 的 Transaction 属性。如果通过活动的 Transaction 对象对 Connection 执行 Command,但该 Transaction 对象尚未分配给 Command 的 Transaction 属性,则将引发异常。
  3. 执行所需的命令。
  4. 调用 Transaction 对象的 Commit 方法来完成事务,或调用 Rollback 方法来取消事务。

以下代码示例使用 Microsoft® SQL Server™ 上的 ADO.NET 来演示事务逻辑。

SqlConnection myConnection = new SqlConnection("Data Source=localhost;Initial Catalog=Northwind;Integrated Security=SSPI;");
myConnection.Open();

// Start a local transaction.
SqlTransaction myTrans = myConnection.BeginTransaction();

// Enlist the command in the current transaction.
SqlCommand 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 (SqlException 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
{
  myConnection.Close();
}