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

C# 为什么不在web服务和数据库之间回滚事务?,c#,asp.net,web-services,C#,Asp.net,Web Services,我正在使用system.Transactions处理web服务和数据库。当我无法连接到远程数据库时,事务不会回滚。因此,数据被插入到web服务的数据库中,而应该回滚。我正在自己编写web服务代码。分布式事务协调器服务正在运行,我在组件服务中设置了其他参数 最好说Web服务和客户端都在同一台机器上 using System.Transactions; try { using (TransactionScope tscope = new TransactionScope()) {

我正在使用
system.Transactions
处理web服务和数据库。当我无法连接到远程数据库时,事务不会回滚。因此,数据被插入到web服务的数据库中,而应该回滚。我正在自己编写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;
}
请参考此问题:

编辑:

经过大量的对话后,您似乎正在使用ASMXWeb服务。这些是基本的web服务,不支持这种用法

在某些模式(并非全部)下,WCF之类的东西提供了对此的增强支持,并且需要额外的配置。然而,就我个人而言,我的建议是:不要这样做。分布式事务对于本地局域网上的SQL之类的东西来说已经足够棘手了——将web服务添加到混合中,这通常会带来麻烦(这是我的意见)

然而,有些人和这些人相处得很好


以下是您的错误:

 catch(Exception ex)
 {
     string s = ex.Message;
 }
您的代码可能试图告诉您出了什么问题,但您还是接受了异常

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

依我看,完全移除
catch
块。如果坏事发生了,不要把它们藏起来然后想知道发生了什么。让它上升到顶层,您现有的(cough)中央错误处理当然会将该错误写入您经常检查的错误日志中。

编辑:

经过大量的对话后,您似乎正在使用ASMXWeb服务。这些是基本的web服务,不支持这种用法

在某些模式(并非全部)下,WCF之类的东西提供了对此的增强支持,并且需要额外的配置。然而,就我个人而言,我的建议是:不要这样做。分布式事务对于本地局域网上的SQL之类的东西来说已经足够棘手了——将web服务添加到混合中,这通常会带来麻烦(这是我的意见)

然而,有些人和这些人相处得很好


以下是您的错误:

 catch(Exception ex)
 {
     string s = ex.Message;
 }
您的代码可能试图告诉您出了什么问题,但您还是接受了异常

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



依我看,完全移除
catch
块。如果坏事发生了,不要把它们藏起来然后想知道发生了什么。让它上升到顶层,您现有的(cough)中央错误处理当然会将该错误写入您经常检查的错误日志。

您的SQL之前有一条未完成的返回语句……我只是从我修改的代码中复制了它it@Raymond莫菲:你说:“当我无法连接到远程数据库时,事务不会回滚“我想知道如果您不连接到数据库,应该执行哪种事务回滚,执行哪种插入!!!!”!!!!我第一次连接到web服务时,一些记录将插入web服务的数据库,然后我想连接到我的远程数据库,但我无法连接到它,因此插入web服务的数据应该被删除(回滚)@Raymond Morphy:那么你有两个分开的数据库?若数据库是分开的,而不是在一台服务器上,你们就不能以事务方式进行工作。你们的SQL之前有一个未完成的返回语句……我只是从我修改过的代码中复制了它it@Raymond莫菲:你说:“当我无法连接到远程数据库时,事务不会回滚”我想知道如果您不连接到数据库,什么样的事务应该回滚,什么样的插入执行!!!!我第一次连接到web服务时,一些记录将插入web服务的数据库,然后我想连接到我的远程数据库,但我无法连接到它,因此插入web服务的数据应该被删除(回滚)@Raymond Morphy:那么你有两个分开的数据库?如果数据库是分开的,而不是在一台服务器上,您就不能以事务方式进行工作。我的问题是:出现异常,但web服务功能无法滚动back@Raymond您使用的是哪种WCF绑定?并非所有支持事务。。。您还需要其他步骤来启用它们:我不使用WCF,而是使用ASMXWebservices@Raymond-ASMX不是事务性的。。。交易需要很多额外的钩子。Gravell我该怎么办?请给我一个解决方案我的问题是:出现异常,但web服务功能无法滚动back@Raymond您使用的是哪种WCF绑定?并非所有支持事务。。。您还需要其他步骤来启用它们:我不使用WCF,而是使用ASMXWebservices@Raymond-ASMX不是事务性的。。。交易需要很多额外的钩子。Gravell我该怎么办?请给我一个解决办法