TransactionScope alternative without DTC
Asked Answered
E

2

6

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.
Evidentiary answered 28/6, 2012 at 11:42 Comment(1)
In my experience setting Enlist=false in the connection string caused TransactionScope not to work at all; no updates were enlisted in the available TransactionScope. I verified this using a Standard SQL Trace that included Transaction Events against an Entity Framework 6 application.Joub
U
11

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)!

Ulu answered 28/6, 2012 at 11:43 Comment(12)
Almost right. Only if you open different connections (SQL Server 2008+) will the transaction escalate (if you are using the same connection string, you will still be using the LTM).Forras
@Evidentiary - For a distributed transaction, you need a transaction manager. No if buts or maybes.Forras
@Oded, yes it differs between version of SQL Server too.Ulu
@MarcGravell - Not on the same DB/Server, as far as I have seen.Forras
I think that 2005 was like I described and 2008 supports like Oded describes.Ulu
@Evidentiary It might depend on your implementation of the membership provider.Ulu
I think you can trigger DTC-ness through having multiple connections open in multiple threads, even if it's to the same DB, but if they are using the same transaction.Ulu
@Ulu I am using System.Web.Security.MembershipProvider. is it correct?Evidentiary
iirc, if several databases or nested connections are used, then transaction will be escalated to distributed. Correct?Otolaryngology
@Otolaryngology I think it should be possible with Server 2008 to open two connections from the same thread for the same transaction, as they are pooled internally.Ulu
A bit late to the party here, but @Henrik, you're saying you can avoid DTC when opening multiple connections from multiple threads to the same database in a single transaction by using DependentTransaction? From where do you have this information? I'm having trouble making that exact case work using SQL Server 2013, so starting to doubt this statement. :)Brower
@Forras using the same connection string, if I open different connections (SQL Server 2012) within TransactionScope the transaction escalate (DTC). Why ?Desmarais
M
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!

Message answered 18/9, 2014 at 17:12 Comment(1)
Enlist=false not uses Transaction ?Desmarais

© 2022 - 2024 — McMap. All rights reserved.