如何获取两个线程将特定的时间戳插入到表中?

问题描述:

我创建了两个(或更多)线程在数据库的表中插入数据。插入时,有一个字段CreatedDateTime,当然,它存储记录创建的日期时间。如何获取两个线程将特定的时间戳插入到表中?

对于一个情况下,我想线程来保持同步,让自己CreatedDateTime领域将具有完全相同的值。当与多线程测试,平时我有不同的毫秒...

我想测试我的系统中不同的场景,如:

  • 1)冲突插入记录正好在同一时间。
  • 2)订购/选择记录的问题。
  • 3)数据库连接池问题。
  • 4)多个用户(百人)同时访问的问题。

可能有其他测试情况下,我还没有在这里列出。

+0

这几乎违背了线程调度程序的想法... – GEOCHET 2009-02-20 01:05:35

+0

我想你误解了同步的词。 – 2009-02-20 01:07:00

是的,就是这样。即使由于某种性质的怪异,你的线程也要在同一时间开始,他们很快就会因为它们之间的资源争用(最起码,访问数据库表或DBMS服务器进程)而很快失去控制。

如果他们留大多是在步骤(即从来没有超过几毫秒更多),只是选择不同的“分辨率”为您CreatedDateTime领域。把它放在第二个(或第二个)而不是毫秒的最接近的10 。或以其他方式使用固定值。

否则,只要意识到这是完全正常的行为。

而且,作为在评论中指出的BC,你可能误解这个词的使用“同步”的。它被使用(在Java中,我希望C#是类似的),以确保两个线程不会同时访问同一资源。实际上,它几乎可以保证线程不会保持同步,因为你理解这个术语的含义(我个人认为你的定义在英语使用方面是正确的(同时发生的事情),但某些计算机语言已经将定义他们自己的目的)。

如果您正在测试时会发生什么具体的时间戳进入数据库,你可以不依赖于线程“表现自己”的计划正在按照特定的顺序,并在特定的时间。你真的需要以某种方式虚拟出数据,否则就像试图将果冻钉在树上(或者训练一只猫)。

一个解决方案是不使用诸如getCurrentTime()now()之类的东西,而是使用具有已知时间戳的特定插入组。根据您的实际架构,这可能很困难(例如,如果您只是调用一个本身获取当前时间戳为毫秒分辨率的API)。

如果您控制填充时间戳列的实际SQL,则需要将其更改为使用预先计算的值,而不是now()或其等效项。

如果你想有插入多行相同的时间戳;你应该创建一个SQL线程,它将在一个查询中执行多行插入,这将允许你获得相同的时间戳。除此之外,我同意其他人的看法,除非您在应用程序中看到插入时间戳,并且共享要插入的时间戳,否则无法以多线程获取超大分辨率的确切时间戳。这当然会引发线索问题。这就像是说,我要分享这些数据,但我不想使用互斥锁,因为一旦它碰到锁(),它们就停止处理另一个线程。