这是我第一个使用WCF客户端和服务器的项目,涉及到SQL Server 2008。
我被迫在我的Windows窗体应用程序中使用TransactionScope事务来作为客户端访问WCF服务。我之前从未使用过这种类型的事务,通常使用connection.BeginTransaction(),因为可以更容易地跟踪其进展情况。
我调用一个函数(希望该函数嵌套了事务),但其中一个新建TransactionScope实例的调用会出现“事务已中止”的异常。内部异常为空。我认为在此之前事务已经回滚了,但是我不知道如何跟踪当前是否存在正在进行的环境事务以及其状态。
以下是示例客户端代码(非真实代码。我已检查所有函数是否使用了scope.Commit())。 请问如何定位问题?
(经常收到必须启动MSDTC服务的错误消息,我已经启动了该服务,但不理解为什么在只有一个数据库/WCF服务的情况下需要使用分布式)
void Function1(AMessageObj m)
{
using (var client = GetOpenWebClient())
WriteMessage(m, client);
}
void WriteMessage(AMessage m, OpenWebClient client)
{
using (var scope = new TransactionScope())
{
var audit = GetSomeAuditInfo(AMessage.UserId, client);
WriteTheMessage(AMessage, client);
WriteAudit(audit, client);
client.SetTime(DateTime.Now);
scope.Commit();
}
}
AuditRecord GetSomeAuditInfo(Int userId, OpenWebClient client)
{
var result = client.ReadAuditRecord(userId);
return AuditRecord.FromWeb(result);
}
void WriteTheMessage(AMessage msg, OpenWebClient client)
{
using (var scope = new TransactionScope())
{
client.WriteTheMessage(msg.ToWeb());
scope.Commit();
}
}
void WriteAudit(AuditRecord audit, OpenWebClient client)
{
using (var scope = new TransactionScope())
{
client.WriteAudit(audit.ToWeb());
scope.Commit();
}
}
例子服务 WCF
[ServiceContract]
interface IService
{
[OperationContract]
void WriteTheMessage(WebRecord message);
[OperationContract]
WebRecord ReadAuditRecord(int userId);
[OperationContract]
void WriteAudit(WebRecord audit);
}
class MyWebService : IService
{
[OperationBehavior(TransactionScopeRequired = true)]
void IService.WriteTheMessage(WebRecord record)
{
using (var connection = GetOpenConnection())
{
dowritethings;
}
}
[OperationBehavior(TransactionScopeRequired = false)]
WebRecord IService.ReadAuditRecord(WebRecord record)
{
using (var connection = GetOpenConnection())
{
return readthings;
}
}
[OperationBehavior(TransactionScopeRequired = true)]
void IService.WriteAudit(WebRecord record)
{
using (var connection = GetOpenConnection())
{
dowritethings;
}
}
}