假设在TestApp类有个MyMethod()
则:// -----------------------------------------------------------------
// TestApp.cs
// Generate a Strong name: 
//    sn -k TestApp.snk
// Compile the code:
//    csc /target:exe /r:System.EnterpriseServices.dll TestApp.cs
// Run TestApp:
//    start TestApp.exe
// -----------------------------------------------------------------
using System;
using System.Runtime.CompilerServices;
using System.EnterpriseServices;
using System.Reflection;//Registration details.
//COM+ application name as it appears in the COM+ catalog.
[assembly: ApplicationName("TestApp")]
//Strong name for assembly.
[assembly: AssemblyKeyFileAttribute("TestApp.snk")][Transaction(TransactionOption.Required)]
public class Account : ServicedComponent
{
  //Provides SetComplete behavior in the absence of exceptions.
  [AutoComplete]
  public void MyMethod(int amount)
  {
     // Do some database work. Any exception thrown here aborts the 
     // transaction; otherwise, transaction commits.
  }
}
                                                           可以吗?

解决方案 »

  1.   

    数据库连接和数据库事务都不应该在数据服务的类中生成,可以把它们作为参数传入数据服务的类中,这样在数据服务的类外就可以控制它们了。
    Microsoft.ApplicationBlocks.Data就是这么做的,你可以参考一下。
      

  2.   

    假定你封装的类是:DataAccess.DataAccessHelper事务的正确使用方法是:
    1)在try外,定义连接和事务;
    2)在try里,先启动事务,再调用带事务参数的访问数据库的接口函数,最后提交事务;
    3)在catch里,处理各种异常情况;
    4)在finally里,结束事务。
    IDbConnection conn = null;//定义连接
    IDbTransaction trans  = null;// 定义事务
    try
    {   
    DataAccess.DataAccessHelper.BeginTransaction(out conn, out trans);//开始事务,位于try里面(常为try内首句)
    ……
    ……//处理主流程(加入事务处理的子函数均须带有trans参数)
    ……
    trans.Commit();//事务提交,位于try里面(常为try内尾句)
    }
    catch (DataAccess.DataAccessException)
    {
    //trans.Rollback();//事务回滚,现在不再必要!!(有也无妨)
    ……
    ……//处理异常
    ……
    }
    finally
    {
    DataAccess.DataAccessHelper.EndTransaction(ref conn, ref trans); //结束事务,位于finally里面,不要放入try或catch里面,连接和事务在此释放(未提交未回滚的事务先回滚)。
    ……
    ……//处理结尾的流程(不管有没有异常,不管有没有return语句,均须执行的流程)
    }
    使用事务须注意:如某一个数据表在事务中修改数据纪录,查询这个数据表的数据纪录时也须使用带事务参数的查询函数!特别是在循环体中使用事务时须注意这一点!
      

  3.   

    做事务:假定你其它的简单封装都做好了:
    #region use Transaction,启动事务和结束事务。
    /// <summary>
    /// 启动新事务。
    /// </summary>
    /// <returns></returns>
    public static void BeginTransaction(out IDbConnection conn, out IDbTransaction trans)
    {
    try
    {
    conn = DbConnFactory.instance().request();
    trans = conn.BeginTransaction();//psk
    }
    catch (Exception eh)
    {
    throw new DataAccessTierException(eh.Message);
    }
    }
    /// <summary>
    /// 结束指定事务。
    /// </summary>
    /// <param name="trans"></param>
    public static void EndTransaction(ref IDbConnection conn, ref IDbTransaction trans)
    {
    if (trans != null)
    {
    if(trans.Connection != null)//psk
    {
    trans.Rollback();
    }
    trans = null;//psk
    }
    if (conn != null)
    {
    if(conn.State == System.Data.ConnectionState.Open)
    {
    conn.Close();
    }
    conn = null;
    }
    } #endregion use Transaction,启动事务和结束事务。
      

  4.   

    谢谢楼上的,能不能在使用的时候不出现Connection和Transaction呢?都封装在类里面,通过成员函数来调用 istring(嬴氏血脉)
    你那个看不懂啊,能不能解释一下呀
      

  5.   

    orcale(小三) 
    能不能提供一些链接阿?谢谢阿
      

  6.   

    http://www.codeproject.com/dotnet/declarativetransactions.asp