2013-04-22 67 views
0

我想知道我該如何處理這個案子,如果有人能幫助我,我會非常感激!兩個DB上的交易

我使用數據庫註冊和角色用戶等我還使用另一個數據庫爲一個用戶的所有數據。對於所有用戶,我只有一個數據庫,但每個用戶都有一個數據庫供他的數據使用。 當我在UserDB和UserData上創建用戶I inser數據時。我正在使用會員註冊的API。

我想知道如何使用事務來檢查所有數據是否正確插入(第一次創建用戶)。

例如:

我註冊一個用戶(在我的userDB的創建爲每個表中的行)。 我爲該用戶創建一個數據數據庫,並在其數據庫的一個表上創建主要信息。

如果我可以插入數據DB,我該如何回滾事務?

+0

使用分佈式事務(必須打開DTC)。如果相同的服務器,DTC可能不會被要求,只是開始交易... – 2013-04-22 08:54:09

+0

我認爲你可以找到[this](http://stackoverflow.com/a/224702/1912688)回答很有用:你可以管理一個交易在多臺服務器上 – misleadingTitle 2013-04-22 08:54:51

+0

我不能使用分佈式事務,因爲我使用API​​。 – user2112420 2013-04-22 09:16:52

回答

3

正如其他人在評論中指出的那樣,您需要使用分佈式事務來確保兩個數據庫事務是在單個工作單元下進行的(或者即使更新同一個數據庫,因爲Membership將使用自己的連接, DTC仍然需要)。通過將ASP Net Membership API和您的其他數據庫連接(例如Linq2SQL或Entity Framework)的呼叫都包裝在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通常足以滿足大多數情況下。詳情請看這裏:Why is System.Transactions TransactionScope default Isolationlevel Serializable