TransactionScope alternative without DTC

2020-06-04 04:38发布

问题:

are there any alternative to transactionScope which does not need to enable DTC??

In the transaction I need to make two operations:

  1. Create one user (using membership - sql membership provider)
  2. Do one insert operation.

回答1:

TransactionScope uses the LTM - Lightweight Transaction Manager in .Net. Only if you open more than one connection in the same transaction or go between databases, should TransactionScope promote the transaction to the 2PC-based TX-manager, DTC.

For MS SQL Server 2008 and above, the DTC will become involved only if you are opening connections to different DBs. OR if you are opening connections in the same transactions from multiple threads EXCEPT if you are using DependentTransaction which is what you should enlist in your global transaction if you want to do threading.

As a side-point: I have some support for the multi-threading story in Castle.Transactions.

Side-point #2: If you use TransactionScope, make sure to declare the IsolationLevel explicitly otherwise you're serializing all your transactions (IsolationLevel.Serializable)!



回答2:

Add Enlist=false in the connection string of your Membership.

connectionString="Data Source=xxx;Initial Catalog=xxx;Persist Security Info=True;User ID=xxx;Password=xxx;Enlist=false"

This is my use case:

using (TransactionScope tScope = new TransactionScope())
{
    MembershipCreateStatus createStatus;
    Membership.CreateUser(model.Email, model.Password, model.Email, null, null, true, model.Id, out createStatus);

    if (createStatus == MembershipCreateStatus.Success)
    {
       Roles.AddUserToRole(model.Email, "Administrator");
       _UpdatePersonnelAccess(model);
       _UpdatePersonnelHasAccess(model);
       _SendEmail_Welcome(model);
       PersonSessionLog.ManageSession(model);
    }
    else
       ViewBag.Message = "Error";

    tScope.Complete();
}

My application is published in Amazon EC2 while the database is in Amazon RDS. DTC is not supported in RDS that's why I also needed a way to prevent escalation to DTC. Btw, I am using SQL Server 2008 R2. I have 2 databases - ASPNETDB, data DB

Thanks to Paul post!