gpt4 book ai didi

c# - 事务和 TransactionScope 隔离

转载 作者:行者123 更新时间:2023-11-30 22:24:34 33 4
gpt4 key购买 nike

我必须向我的数据库添加大量信息。添加此信息大约需要 5-7 分钟。我需要添加交易。

我试过这个:

try { 
db.Connection.Open();
db.Transaction = db.Connection.BeginTransaction();
UpdateTable1();
UpdateBigTable2();
...
db.Transaction.Commit();
} catch {
db.Transaction.Rollback();
}

但是当我的数据库正在更新时,我无法读取或使用我的数据库做任何事情。

我尝试设置 IsolationLevel,但没有任何帮助。

我试过这个:

using (var ts = new TransactionScope()) {
UpdateTable1();
ts.Complete();
}

但程序在 2-3 分钟后崩溃。

这个解决方案也没有帮助:

var transactionOptions = new TransactionOptions();
transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.Serializable;
transactionOptions.Timeout = TimeSpan.MaxValue;
using (var ts = new TransactionScope(TransactionScopeOption.Required, transactionOptions))
{
...
}

如果我设置 TransactionScopeOption.Suppress,我可以在更新时访问我的数据库但在这种情况下,交易不起作用。

最佳答案

是的,如果您启动一个处理大量记录的事务,并且需要很长时间才能完成,那么直接的结果是竞争操作将被阻止。这对于“可序列化”事务尤其是正确的,因为它们占用最多的锁(包括键范围锁等)。这是交易的本质;它是 ACID 中的 I。

选项:

  • 不要在一笔巨额交易中做所有事情
  • 让您的读取操作有意地读取过去 锁(这是一把巨大的双刃剑 - 可能没问题,但可能会导致大问题 - 谨慎对待) - 例如 NOLOCKREAD UNCOMMITTED
  • 在完整的 SQL 服务器(不是 CE)上,尝试使用快照隔离

关于c# - 事务和 TransactionScope 隔离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12742241/

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