在工作线程中访问主线程未提交的数据

时间:2011-01-07 16:36:45

标签: .net multithreading transactions

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

我已经有了子任务的以下方法。 1. CreatePO 2. CreateItem 3. AddDeliveryScheduleToItem(ItemId)。

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

在向项目I添加交付计划时,会从数据库中检索项目记录,以检索有关当前代码编写方式的计划详细信息。

到目前为止一切顺利。

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

使用ThreadPool我并行激活AddDeliveryScheduleInThread()。现在,当AddDeliveryScheduleToItem(ItemId)尝试根据项目ID检索项目记录时,会出现问题。记住我们在事务中的主线程中创建了这个项目,但它还没有提交。

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

如何解决此问题?请帮我。

我愿意不使用Spring.NET事务。我现在正在研究可靠交易和可承诺交易,如果可以帮助的话。

由于

1 个答案:

答案 0 :(得分:0)

  

AddDeliveryScheduleToItem(项目Id)   尝试检索Item记录   基于商品ID。记得我们创造了   这个项目在主线程中   交易,但它没有提交   爱好。

我只能想到两个选择。

1)在提交事务之前不要添加DeleliScheduleToItem(ItemId)。

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

快速制作2的简单方法是简单地将其添加到队列中而不是完成整个过程。让另一个进程查看该队列以查看是否有新项目要安排,然后安排进行长时间运行。