.net控制数据库事务:COM+事务

在分布式应用程序中,往往要同时操作多个数据库,使用数据库事务就不能满足业务的要求了。在COM+中,提供完整的事务处理服务。很方便处理多个数据库上的事务。
Demo:

COM+事务

/// <summary>  
/// COM+事务  
/// </summary>  
public void ComTran()  
{  
    SqlConnection conn = new SqlConnection("Data Source=127.0.0.1;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=123;");  
    SqlCommand cmd = new SqlCommand();  
    ServiceConfig sc = new ServiceConfig();  
  
    //指定事务类型  
    sc.Transaction = TransactionOption.Required;  
    //设置启动跟踪  
    sc.TrackingEnabled = true;  
    //创建一个上下文,该上下文的配置由作为 cfg 参数传递的 ServiceConfig 对象来指定。  
    //随后,客户端和服务器端的策略均被触发,如同发生了一个方法调用。  
    //接着,新的上下文被推至上下文堆栈,成为当前上下文  
    ServiceDomain.Enter(sc);  
    try  
    {  
            cmd.CommandText = "Update Region Set RegionDescription=@UpdateValue where RegionID=@UpdateID";  
            cmd.CommandType = CommandType.Text;  
            cmd.Connection = conn;  
            conn.Open();  
            SqlParameter[] paras = new SqlParameter[]{  
                                new SqlParameter ("@UpdateID",SqlDbType.Int,32),  
                                new SqlParameter ("@UpdateValue",SqlDbType .NChar,50)};  
            paras[0].Value = "2";  
            paras[1].Value = "Update Value22";  
  
            foreach (SqlParameter para in paras)  
            {  
                cmd.Parameters.Add(para);  
            }  
            cmd.ExecuteNonQuery();  
  
  
            cmd.CommandText = "insert into Region values(@InsertID,@InsertValue)";  
            cmd.CommandType = CommandType.Text;  
  
            paras = new SqlParameter[]{  
                                new SqlParameter ("@InsertID",SqlDbType.Int ,32),  
                                new SqlParameter ("@InsertValue",SqlDbType.NChar ,50)};  
            paras[0].Value = "9";  
            paras[1].Value = "Insert Value";  
  
            cmd.Parameters.Clear();  
            foreach (SqlParameter para in paras)  
            {  
                cmd.Parameters.Add(para);  
            }  
  
            cmd.ExecuteNonQuery();  
  
            //提交事务  
            ContextUtil.SetComplete();  
    }  
    catch  
    {  
        //回滚事务  
        ContextUtil.SetAbort();  
        throw;  
    }  
    finally  
    {  
        conn.Close();  
        //触发服务器端的策略,随后触发客户端的策略,如同一个方法调用正在返回。  
        //然后,当前上下文被弹出上下文堆栈,调用 Enter 时正在运行的上下文成为当前的上下文。  
        ServiceDomain.Leave();  
    }  
  
}  

在.net中还有些也能进行事务处理,如web Service中


需要特别补充的是:
如果你使用的是分布事务(TransactionScope事务和COM+事务),在默认情况下你是要重新配置安装SQL Server数据库服务器和访问数据库的客户端的.(如果没有配置运行会出现以下错误:该伙伴事务管理器已经禁止了它对远程/网络事务的支持。 (异常来自 HRESULT:0x8004D025)
)下面是MSDN上关于配置分布式事务的一段原话:
配置分布式事务
要启用分布式事务,可能需要通过网络启用 MS DTC,以便在使用应用了最新的 Service Pack 的较新操作系统(例如 Windows XP 或 Windows 2003)时使用分布式事务。如果启用了 Windows 防火墙(Windows XP Service Pack 2 的默认设置),必须允许 MS DTC 服务使用网络或打开 MS DTC 端口。

实际怎么配置呢,经过我的实际使用:大致如下: 打开'控制面板'->'管理工具'->'组件服务',点开'组件服务'->'计算机'->'我的电脑',在'我的电脑'上右击属性,点'MSDTC',然后点'安全性配置'。作为数据库的服务器的配置如下:

而访问数据库的客户端的配置和服务器端的稍有些差别:

在设置完上面的还有使防火墙MS DTC 服务使用网络或打开 MS DTC 端口:运行netsh firewall set allowedprogram %windir%\system32\msdtc.exe MSDTC enable命令就可以了。



posted @ 2011-11-22 13:48  lenya  阅读(260)  评论(0编辑  收藏  举报