【发布时间】:2020-05-09 10:44:44
【问题描述】:
在数据库事务中更改隔离级别是可以的,包括将一个事务加入到已经运行的事务的情况。 从现在开始,您只需更改处理锁的方式。使用 Sql Server,运行没有问题:
begin transaction
set transaction isolation level serializable;
select * from FooTable;
set transaction isolation level read committed;
select * from FooTable;
begin transaction
set transaction isolation level serializable;
select * from FooTable;
--transaction_isolation_level can be observed as 4 (serializable)
但是,当使用 .NET TransactionScope 在上述 Sql Server 中创建事务时,像这样(C#,xUnit):
[Theory]
[AutoFixtureMagicToGetParameterInstances]
void ZmenaIzolacniUrovneVedeKVyjimce(IFooDao sut, Foo foo)
{
var tranOpts = new TransactionOptions()
{
IsolationLevel = IsolationLevel.Serializable,
Timeout = TimeSpan.FromSeconds(60)
};
var tranOpts2 = new TransactionOptions()
{
IsolationLevel = IsolationLevel.ReadCommitted,
Timeout = TimeSpan.FromSeconds(60)
};
using (var transactionScope = new TransactionScope(TransactionScopeOption.Required, tranOpts))
{
sut.SelectFoos();
using (var transactionScope2 = new TransactionScope(TransactionScopeOption.Required, tranOpts2))
{
sut.SelectFoos();
}
}
}
导致异常:
System.ArgumentException : The transaction specified for TransactionScope has a different IsolationLevel than the value requested for the scope.
Parameter name: transactionOptions.IsolationLevel
为什么 TransactionScope 的设计者认为有必要立即抛出异常?
我希望至少只要只涉及数据库资源,行为就会相同。 是否有一些关于 TransactionScope 的内容我遗漏了,或者仅仅是因为无法保证所有可能的征募资源的合理行为?
【问题讨论】:
-
并非如此。这几乎是同一个问题 - 所以我很抱歉,我应该进行更多搜索,我希望这样的问题能够提及异常的独特部分。但是也没有回答“为什么可以在这里改变隔离级别而不在那里”(正如 OP 在评论中指出的那样):( 所以不,它并没有真正回答它。
-
我将其标记为重复问题。 “这个答案是否”是堆栈溢出的一部分在标记重复问题时更新自动评论文本
-
我明白了。现在我注意到可接受的答案在可接受的答案下方的评论中 - 这并不比我在问题的最后一段中指出的更多,但我想没有人会添加更多内容。我想我应该对我的问题投票并在那里编辑答案,以便下次更明显?
-
再想一想,我的问题略有不同,更多的是针对“为什么存在差异” - 我会在这里进行适当的编辑。
标签: c# transactions transactionscope