两个DB上的交易

时间:2013-04-22 08:52:52

标签: c# asp.net linq

我想知道我怎么能在这个案子上做,如果有人能帮助我,我会非常感激!

我使用DB作为注册和角色用户等。我还使用另一个DB来获取一个用户的所有数据。我只为所有用户提供了一个数据库,但我为每个用户提供了一个数据库。 当我创建用户时,我在UserDB上的内容数据以及UserData。我正在使用会员资格api进行注册。

我想知道如何使用事务来检查所有数据是否正确插入(第一次创建用户时)。

例如:

我注册了一个用户(为我的UserDB上的每个表创建一行)。 我在该数据库的一个表中为该用户创建了一个主要信息的数据数据库。

如果可以在Data DB上插入,我怎么能回滚事务?

1 个答案:

答案 0 :(得分:3)

正如其他人在评论中所指出的那样,您需要使用分布式事务来确保两个数据库事务都在单个工作单元下进行(或者即使更新同一个数据库,因为成员资格将使用自己的连接,DTC仍然需要)。通过将您的调用包装到ASP Net Membership APISystem.Transactions.TransactionScope下的其他数据库连接(例如Linq2SQL或实体框架),您可以确保您的更新是ACID。

请注意,您需要在应用服务器和两个数据库服务器上运行和配置MS DTC。

以下是一个例子:

using (var ts = new TransactionScope())
{
    // Update Membership user   
    MembershipUser currentUser = Membership.GetUser(someUserId);    
    currentUser.Comment = "HairColor is changing";
    Membership.UpdateUser(currentUser);

    // Update equivalent record in other database (assumed EF Context and Same Primary Key)
    var otherUser = _db.OtherUserTable.Where(ut => ut.UserId == someUserId)
                                      .FirstOrDefault();
    otherUser.HairColor = "Orange";
    _db.SaveChanges();

    // Commit  
    ts.Complete();
}

需要注意TransactionScope的一个警告是,默认隔离级别为Read Serializable,在许多情况下可能过度 - Read Committed通常足以满足大多数情况。有关详情,请参阅此处:Why is System.Transactions TransactionScope default Isolationlevel Serializable