0

我想知道在这种情况下我该怎么做,如果有人可以帮助我,我将不胜感激!

我将数据库用于注册和角色用户等。我还将另一个数据库用于一个用户的所有数据。我只有一个数据库供所有用户使用,但我为每个用户提供一个数据库来存储他的数据。当我创建用户时,我会在 UserDB 和 UserData 上插入数据。我正在使用会员 api 进行注册。

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

例如:

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

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

4

1 回答 1

3

正如其他人在评论中指出的那样,您需要使用分布式事务来确保两个数据库事务在单个工作单元下进行(或者即使更新同一个数据库,因为成员资格将使用自己的连接,仍然需要 DTC )。通过将您对 theASP Net Membership API和其他数据库连接(例如 Linq2SQL 或实体框架)的调用包装在 a 下System.Transactions.TransactionScope,您可以确保您的更新是 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通常对于大多数情况来说已经足够了。请参阅此处了解更多信息:为什么 System.Transactions TransactionScope 默认 Isolationlevel Serializable

于 2013-04-22T12:52:53.200 回答