没有DTC的TransactionScope替代方案

有什么替代transactionScope不需要启用DTC ??

在交易中,我需要做两个操作:

  1. 创建一个用户(使用成员资格–sql成员资格提供者)
  2. 做一次插入操作。

TransactionScope使用.Net中的LTM – 轻量级事务管理器。 只有当您在同一事务中打开多个连接或在数据库之间切换时,TransactionScope才会将事务提升到基于2PC的TX管理器DTC。

对于MS SQL Server 2008及更高版本,仅当您打开与不同 DB的连接时,DTC才会参与。 或者,如果要在多个线程的相同事务中打开连接,则除非使用DependentTransaction ,否则如果要进行线程处理,则应在全局事务中登记。

作为一个侧面点:我对Castle.Transactions中的multithreading故事有一些支持。

侧点#2:如果您使用TransactionScope,请确保明确声明IsolationLevel,否则您将序列化所有事务(IsolationLevel.Serializable)!

在您的成员资格的连接字符串中添加Enlist=false

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

这是我的用例:

 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(); } 

我的应用程序在Amazon EC2中发布,而数据库在Amazon RDS中。 RDS不支持DTC,这也是我需要一种方法来防止升级到DTC的原因。 顺便说一下,我正在使用SQL Server 2008 R2。 我有2个数据库 – ASPNETDB,数据DB

感谢Paul的post !