transactioncope会对多个不同服务的调用工作吗?

时间:2010-06-18 10:26:38

标签: asp.net datacontext transactionscope

我正在C#asp.NET MVC2中编写一些合并功能。我也在使用Linq2SQL。

我有一个代码块,它调用两个服务,即MessageService和UserService。这些都在称为适当的存储库并对数据库进行修改。每个存储库都声明它自己的存储库实例,所以我认为这会将以下代码升级到DTC。从AccountService调用代码,这是否可以在此级别工作?并且在每个存储库的顶部声明DataContext或者我应该以某种方式传递对象是不好的做法吗?提前谢谢

//Run the merge
try
{
    using (TransactionScope scope = new TransactionScope())
    {
        // Update Messages to be owned by primary user
        if (!_MessageService.UpdateCreatedById(MergeUser.UserID, CoreUser.UserID))
        {
            return false;
        }

        // Update Comments to be owned by primary user
        foreach (var curComment in _MessageService.GetUserComments(MergeUser.UserID))
        {
            curComment.CreatedBy = CoreUser.UserID;
        }

        _MessageService.Save();

        // Update Logins to be owned by primary user
        foreach (var CurLogin in _UserService.GetLogins(MergeUser.UserID))
        {
            CurLogin.UserID = CoreUser.UserID;
        }

        _UserService.Save();

        scope.Complete();
    }

    return true;
}
catch (Exception ex)
{
    _ErrorStack.Add(ex.Message);
    ErrorService.AddError(new ErrorModel("Portal", "WidgetRepository", ErrorHelper.ErrorTypes.Critical, ex));
    return false;
}

2 个答案:

答案 0 :(得分:1)

是的,这会有效。 TransactionScope利用分布式事务协调器,因此它能够托管超出数据库级别的事务。

DataContext生命周期的推荐做法是将其限制为工作单元。

答案 1 :(得分:1)

我的存储库中有两个构造函数,一个用于获取数据上下文,另一个用于不存在(然后将其自身实例化)。这意味着我可以根据需要使用共享数据上下文创建存储库。

我的服务类然后在其构造函数中获取存储库对象,因此我可以使用共享数据上下文的存储库来实例化多个服务(如果需要)。