【问题标题】:Transaction open for many hours交易开放数小时
【发布时间】:2014-11-24 10:59:47
【问题描述】:

像这样在 TransactionScope 中包装一个需要三个小时才能运行的进程有什么问题吗:

Dim transactionOptions As TransactionOptions = New TransactionOptions()
Using scope As New TransactionScope(TransactionScopeOption.Required, transactionOptions)
msgbox("Message Box 1")
scope.complete()
End Using
msgbox("Message Box 2")

从 Message Box 1 到 Message Box 2 大约需要五个小时。

我确定我过去曾尝试过另一个长时间运行的进程,但事务一直超时(我可能是错的),所以我在每个循环上都承诺了。我在某处读到你应该尽可能多地提交。我的方法有什么问题吗?

【问题讨论】:

  • 如果您的交易需要五个小时才能完成,那么您的设计就会遇到更大的问题
  • @Matt Wilko,如果你有一个程序循环遍历 10 亿条记录,并且每条记录需要 x 分之一秒的时间来运行,会发生什么?我猜你会说;在每个循环上提交。
  • 首先你必须质疑你为什么这样做。添加 WHERE 子句以减少您正在读取的数据量。第二次读取数据不应该是事务的一部分,只能插入/更新/删除,所以在你这样做之前开始你的事务。在进行更新之前,您可能需要重构代码以获取要更新的记录列表。
  • @matt wilko,问题是每条记录都必须每周更新。在我看来,使用sql的逻辑太复杂了。我总是使用 sql 做尽可能多的工作。
  • @W0051977:如果您需要每周更新每条记录,您是否考虑过“最后更新”列,以便可以更新事务中的每条记录?是否真的有必要在单个事务中更新所有记录?如果您向我们提供更多信息,也许我们可以帮助您应对挑战。

标签: .net vb.net transactions timeout transactionscope


【解决方案1】:

有四个基本属性..是的,每个人都知道...称为ACID

这里只有第一个。

原子性:所以这个属性表示“在原子事务中,一系列数据库操作要么全部发生,要么什么都不发生。”
因此,假设您运行 5 小时的事务有 10000 次数据库操作。您真的希望它们全部发生(10000 次操作)还是根本不发生?更好的方式是,您可以拆分更多交易而不是单个交易吗?

【讨论】:

    【解决方案2】:

    多久提交一次?基本上问题是:你最小的交易是什么?

    考虑一个银行账户的例子(非常非常简单):您可能有 10000 笔资金从一个账户转移到另一个账户,但是如果您从账户 A 转移到账户 B,(假设这将由两个插入)这是一个交易 - 提交这个。然后是下一个。

    【讨论】:

    • “最小操作”+1。
    猜你喜欢
    • 1970-01-01
    • 2010-12-18
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多