为什么不在Web服务和数据库之间回滚事务?

时间:2011-07-11 06:52:20

标签: c# asp.net web-services

我在Web服务和数据库周围使用system.Transactions。当我无法连接到远程数据库时,事务不会回滚。所以数据被插入到Web服务的数据库中,同时应该回滚。我正在写自己的网络服务代码。运行分布式事务协调器服务,并在组件服务中设置其他参数。

最好说Web服务和客户端都在同一台机器上。

using System.Transactions;

 try
{
    using (TransactionScope tscope = new TransactionScope())
    {
        //----- Web service
        IdentificationSystem.Service Identify = new IdentificationSystem.Service();
        Identify.InsertWorkshopInfo(BosWorkshop.WpSvUserName,          BosWorkshop.WpSvPassword,BosWorkshop.WkIcode
        //-------------
        //------------------ connect to a remote DB
        //--------- My Sql Query
        string sq= "SET XACT_ABORT ON;update tbl_kargah " +
            "set email_kargah=email_kargah+@WpCode "+
            "where co_kargah=@co_kargah "+
            "insert into dbo.tbl_WorkshopCodes (co_kargah,Code_ostan,Wpcode) "+
            "values(@Co_kargah,@Code_ostan,@WpCode) "+
            "insert into LnkWorkerSystem.Bazresi_kar.dbo.tbl_Workshopcodes(Co_Kargah,Code_Ostan,WpCode) "+
            "values(@Co_kargah,@Code_ostan,@WpCode) ";

        //--------
        SqlCon = new SqlConnection(@BoBaz.BazConnectionString);
        SqlCon.Open();
        SqlCom = new SqlCommand(sq, SqlCon);
        SqlCom.Parameters.Add("@co_kargah", SqlDbType.BigInt).Value = BoBaz.BazCodeKargah;
        SqlCom.Parameters.Add("@Code_ostan", SqlDbType.NVarChar).Value = BoBaz.BazCodeOstan;
        SqlCom.Parameters.Add("@WpCode", SqlDbType.NChar).Value = BoBaz.WpRealCode;
        SqlCom.ExecuteNonQuery();
        SqlCon.Close();

        tscope.Complete();
    }
}
catch(Exception ex)
{
    string s = ex.Message;
}

请参阅此问题:Transaction

1 个答案:

答案 0 :(得分:1)

编辑:

经过大量对话后,您似乎正在使用ASMX Web服务。这些是 基本 网络服务,不支持此用法。

WCF 在某些模式下(并非全部)都会增加对此的支持,并且需要额外的配置。但是,我个人的建议是:不要。对于像本地局域网上的SQL这样的事情,分布式事务非常棘手 - 将Web服务添加到组合中并且通常会遇到麻烦(我的意见)。

然而,有些人相处得很好 - YMMV。


这是你的错误:

 catch(Exception ex)
 {
     string s = ex.Message;
 }

你的代码可能试图告诉你出了什么问题,但你去了并吞下了这个例外。

我的猜测是分布式事务中的另一个元素(可能是WCF调用)失败,导致整个事务失败。例外会告诉你

IMO,完全删除catch 。如果发生了不好的事情,不要隐藏它们然后想知道发生了什么。让它冒泡到顶层,你现有的(咳嗽)中央错误处理当然将该错误写入你经常检查的错误日志中。