我在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
答案 0 :(得分:1)
编辑:
经过大量对话后,您似乎正在使用ASMX Web服务。这些是 基本 网络服务,不支持此用法。
WCF 在某些模式下(并非全部)都会增加对此的支持,并且需要额外的配置。但是,我个人的建议是:不要。对于像本地局域网上的SQL这样的事情,分布式事务非常棘手 - 将Web服务添加到组合中并且通常会遇到麻烦(我的意见)。
然而,有些人相处得很好 - YMMV。
这是你的错误:
catch(Exception ex)
{
string s = ex.Message;
}
你的代码可能试图告诉你出了什么问题,但你去了并吞下了这个例外。
我的猜测是分布式事务中的另一个元素(可能是WCF调用)失败,导致整个事务失败。例外会告诉你。
IMO,完全删除catch
块 。如果发生了不好的事情,不要隐藏它们然后想知道发生了什么。让它冒泡到顶层,你现有的(咳嗽)中央错误处理当然将该错误写入你经常检查的错误日志中。