【发布时间】: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