C# 无DTC的TransactionScope备选方案
除了transactionScope之外,是否有其他不需要启用DTC的选项 在事务中,我需要进行两个操作:C# 无DTC的TransactionScope备选方案,c#,.net-4.0,transactions,transactionscope,msdtc,C#,.net 4.0,Transactions,Transactionscope,Msdtc,除了transactionScope之外,是否有其他不需要启用DTC的选项 在事务中,我需要进行两个操作: 创建一个用户(使用成员资格-sql成员资格提供程序) 执行一次插入操作 TransactionScope使用.Net中的LTM轻量级事务管理器。只有在同一事务中或在数据库之间打开多个连接时,TransactionScope才应将事务升级到基于2PC的TX manager DTC 对于MS SQL Server 2008及更高版本,仅当您打开到不同数据库的连接时,才会涉及DTC。或者,如果您
TransactionScope使用.Net中的LTM轻量级事务管理器。只有在同一事务中或在数据库之间打开多个连接时,TransactionScope才应将事务升级到基于2PC的TX manager DTC 对于MS SQL Server 2008及更高版本,仅当您打开到不同数据库的连接时,才会涉及DTC。或者,如果您正在从多个线程打开同一事务中的连接,除非您使用的是
DependentTransaction
,如果您要执行线程化,这是您应该在全局事务中登记的
作为补充:我对中的多线程故事有一些支持
旁白#2:如果使用TransactionScope,请确保明确声明IsolationLevel,否则将序列化所有事务(IsolationLevel.Serializable) 在您的会员资格的连接字符串中添加
登记=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();
}
我的应用程序在AmazonEC2中发布,而数据库在AmazonRDS中。RDS不支持DTC,这就是为什么我还需要一种方法来防止升级到DTC。顺便说一句,我使用的是SQLServer2008R2。我有两个数据库-ASPNETDB,datadb
多亏了保罗 几乎是对的。只有打开不同的连接(SQL Server 2008+)时,事务才会升级(如果使用相同的连接字符串,则仍将使用LTM)。@Pedre-对于分布式事务,您需要事务管理器。如果是“但是”或“可能”,则为“否”。@Oded,是的,这两个版本的SQL Server也不同。@MarcGravel-不在同一个数据库/服务器上,就我所见。我认为2005年和我描述的一样,2008年支持像Oded描述的一样。Enlist=false不使用事务?根据我的经验,在连接字符串中设置
Enlist=false
导致TransactionScope
根本不起作用;在可用的TransactionScope
中未登记任何更新。我使用一个标准的SQL跟踪来验证这一点,该跟踪包括针对EntityFramework6应用程序的事务事件。