我正在尝试通过Entity v.4.0.30319将TransactionScope包装在我对存储过程的调用中。我一直遇到以下异常:
无法升级与IsolationLevel快照的交易。
我怎样才能解决这个问题?
底层存储过程基本上是表中的一个大插入语句。
我的代码如下:
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew, GetTransactionOptions()))
{
int? status;
status = GetStatusIDFromEnum(newMatterCredential);
using (MatterCredentialsEntities db = new MatterCredentialsEntities())
{
DateTime? objDateAnnounced = GenerateNullForDateTime(newMatterCredential.DateAnnounced);
DateTime? objDateClosed = GenerateNullForDateTime(newMatterCredential.DateClosed);
DateTime? objDateFinancialClosed = GenerateNullForDateTime(newMatterCredential.DateFinancialClosed);
db.prcCreateCredential(Common.GetUserProfID(), newMatterCredential.MatterID, status, newMatterCredential.DescriptionSummary, newMatterCredential.DescriptionDetailed, newMatterCredential.BusinessEntitySectorID, newMatterCredential.BusinessEntityRoleID, newMatterCredential.UNGeographyID, newMatterCredential.ProjectName, newMatterCredential.ClientIndustryId, newMatterCredential.TransactionValue, newMatterCredential.TransactionCurrencyID, newMatterCredential.OtherParties, newMatterCredential.LegalAdvisers, newMatterCredential.DateAnnounced, newMatterCredential.DateClosed, newMatterCredential.DateFinancialClosed, newMatterCredential.Award, newMatterCredential.NotifyPartner, newMatterCredential.Notes);
}
scope.Complete();
}
public static TransactionOptions GetTransactionOptions()
{
TransactionOptions tranOpt = new TransactionOptions();
tranOpt.IsolationLevel = IsolationLevel.Snapshot;
return tranOpt;
}
答案 0 :(得分:2)
MSDN表示您无法通过快照隔离来推广事务。
MSDN - IsolationLevel Enumeration
快照 - 可以读取易失性数据。在事务修改数据之前,它会验证另一个事务在最初读取后是否更改了数据。如果数据已更新,则会引发错误。这允许事务获得先前提交的数据值。 当您尝试提升使用此隔离级别创建的事务时,将引发InvalidOperationException并显示错误消息:
无法宣传与IsolationLevel快照的交易
自启动交易以来,其他必须更改数据,如果这是其参与的较大交易的一部分
我建议将交易更改为可序列化。
public static TransactionOptions GetTransactionOptions()
{
TransactionOptions tranOpt = new TransactionOptions();
tranOpt.IsolationLevel = IsolationLevel.Serializable;
return tranOpt;
}
编辑:请参阅下文,确保您正在运行MSDTC,因为这需要创建分布式事务。