gpt4 book ai didi

c# - 为什么内部 TransactionScope 的 IsolationLevel 不能不同,而 SQL 事务可以不同?

转载 作者:行者123 更新时间:2023-12-05 07:09:07 25 4
gpt4 key购买 nike

更改数据库事务中的隔离级别是可以的,包括将一个事务加入到已经运行的事务中的情况。从现在开始,您只需更改处理锁的方式即可。使用 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 的内容我遗漏了,或者仅仅是因为无法保证所有可能的征用资源的合理行为?

最佳答案

如此处评论所述Inner TransactionScope with different IsolationLevel, how can it be achieved?

TransactionScope is not limited to use with SQL Server, it can allow distributed transactions across processes/systems. So it is stricter than what SQL Server allows, likely to simplify the complexity of ensuring consistency across the systems than support distributed transactions. – AaronLS

所以答案基本上似乎可以归结为“TransactionScope 可能 在它的板 block 上有更多的方式而不仅仅是数据库事务,因此它禁止像更改隔离级别这样的复杂性”。

关于c# - 为什么内部 TransactionScope 的 IsolationLevel 不能不同,而 SQL 事务可以不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61695446/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com