【问题标题】:Access Main Thread uncommited data in worker thread在工作线程中访问主线程未提交的数据
【发布时间】:2011-01-07 16:36:44
【问题描述】:

我正在处理的代码遇到一个问题。任务是我得到一个包含采购订单详细信息的文件。采购订单有单独的项目,每个项目都有其交货计划。 PO 的创建是原子的(全有或全无)。所以所有这些都在一个事务下运行。

我已经有以下子任务的方法。 1.创建PO 2. 创建项目 3. AddDeliveryScheduleToItem(ItemId)。

当我以顺序方式执行所有这些操作时,一切正常。顺序时尚意味着首先我创建 PO。其次,我将PO下的所有项目一一创建。第三,我将交付计划一一添加到每个订单项。此处,事务在创建 PO 之前开始,并在将交付计划添加到所有项目之后提交。如果有任何错误,应用程序会回滚事务。

在将交付计划添加到项目时,我确实从数据库中检索项目记录以检索计划详细信息,这就是当前代码的编写方式。

到目前为止一切顺利。

现在添加交付计划是一项耗时的任务,因此我们决定添加线程并并行运行添加交付计划。所以我创建了一个名为 AddDeliveryScheduleInThread() 的方法,并在该方法中调用 AddDeliveryScheduleToItem(ItemId)。

使用 ThreadPool 我并行触发 AddDeliveryScheduleInThread()。现在,当 AddDeliveryScheduleToItem(ItemId) 尝试根据项目 ID 检索项目记录时,就会出现问题。请记住,我们在事务的主线程中创建了此项目,但尚未提交。

当前使用 Spring.NET 事务的代码,我在那里找不到太多帮助。

如何解决这个问题?请帮我。

我愿意不使用 Spring.NET 事务。如果有帮助,我现在正在研究 Dependable Transaction 和 Commitable Transaction。

谢谢

【问题讨论】:

  • “现在添加交付时间表是一项耗时的任务” - 你能解释一下吗?
  • 除了简单的插入之外,还涉及一些计算和其他事情。因此,它是我们第一个并行处理以更快地处理整个事务的候选者。主要问题是在多线程模式下,在主线程中创建的项目在将计划添加到项目的工作线程中不可用。
  • 为什么不在一个线程上运行整个歌曲和舞蹈?
  • 它在单线程上运行良好,但性能很慢。借助多线程,我们可以提高性能。

标签: .net multithreading transactions


【解决方案1】:

AddDeliveryScheduleToItem(ItemId) 尝试检索项目记录 基于项目 ID。记住我们创造了 这个项目在主线程中 事务但未提交 还没有。

我只能想到两个选项。

1) 在事务提交之前不要 AddDeliveryScheduleToItem(ItemId)。

2) 不要将 AddDeliveryScheduleToItem(ItemId) 放在另一个线程上,而是让它非常快,这样您就不必将它放在另一个线程上。

使 2 变得非常快的简单方法是将其添加到队列中,而不是执行整个过程。让另一个进程查看该队列以查看是否有新项目要调度,然后调度执行长时间运行的位。

【讨论】:

  • 感谢康纳德的建议,但我认为我不能接受。 1 如果在添加交付计划时出现故障,我需要确保整个事务是原子的,我想回滚 tran。这是要求,因为我们不想修改我们正在尝试处理的文件。对于您的建议 2,我们希望通过并行运行它们来加快流程,因为一个项目可能有数百个时间表,而一个项目可能有数十个或数百个项目。
  • @Henry。因此,如果 PO 中的某个项目无法安排,您想回滚整个流程吗?
  • 是的,这是正确的。 B/c 用户不想手动更新文件。
猜你喜欢
  • 1970-01-01
  • 2017-06-22
  • 1970-01-01
  • 2015-12-07
  • 2013-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多