C# 如何让两个线程在表中插入特定的时间戳?

C# 如何让两个线程在表中插入特定的时间戳?,c#,database,multithreading,concurrency,C#,Database,Multithreading,Concurrency,我创建了两个(或更多)线程来在数据库的表中插入数据。插入时,有一个字段CreatedDateTime,当然,该字段存储记录创建的日期时间 例如,我希望线程保持同步,以便它们的CreatedDateTime字段具有完全相同的值。当使用多线程进行测试时,通常我会得到不同的毫秒数 我想在我的系统中测试不同的场景,例如: 1) 完全同时插入记录时发生冲突 2) 记录的排序/选择问题 3) 数据库连接池出现问题 4) 多个用户(100个)同时访问的问题 可能还有其他我没有在这里列出的测试用例。是的,就

我创建了两个(或更多)线程来在数据库的表中插入数据。插入时,有一个字段
CreatedDateTime
,当然,该字段存储记录创建的日期时间

例如,我希望线程保持同步,以便它们的
CreatedDateTime
字段具有完全相同的值。当使用多线程进行测试时,通常我会得到不同的毫秒数

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

  • 1) 完全同时插入记录时发生冲突
  • 2) 记录的排序/选择问题
  • 3) 数据库连接池出现问题
  • 4) 多个用户(100个)同时访问的问题

可能还有其他我没有在这里列出的测试用例。

是的,就是这样。即使你的线程是在同一时间启动的,但它们很快就会因为它们之间的资源争用(至少是访问DB表或DBMS服务器进程)而失去同步

如果它们大部分保持在同一步(即,永远不会超过几毫秒),只需为CreatedDateTime字段选择不同的“分辨率”。把它放在最接近的十分之一秒(或秒)而不是毫秒。或者以其他方式使用固定值

否则,请意识到这是完全正常的行为

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

如果您正在测试当特定时间戳进入数据库时会发生什么,那么您就不能依靠线程按照特定顺序和特定时间进行调度来“表现自己”。你真的需要以某种方式伪造数据,否则就好比试图把果冻钉在树上(或训练一只猫)

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


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

是的,就是这样。即使你的线程是在同一时间启动的,但它们很快就会因为它们之间的资源争用(至少是访问DB表或DBMS服务器进程)而失去同步

如果它们大部分保持在同一步(即,永远不会超过几毫秒),只需为CreatedDateTime字段选择不同的“分辨率”。把它放在最接近的十分之一秒(或秒)而不是毫秒。或者以其他方式使用固定值

否则,请意识到这是完全正常的行为

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

如果您正在测试当特定时间戳进入数据库时会发生什么,那么您就不能依靠线程按照特定顺序和特定时间进行调度来“表现自己”。你真的需要以某种方式伪造数据,否则就好比试图把果冻钉在树上(或训练一只猫)

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


如果您控制填充timestamp列的实际SQL,则需要将其更改为使用预先计算的值,而不是使用
now()
或其等效值;您应该创建一个SQL线程,该线程将在一个查询中执行多行插入,这将允许您获得相同的时间戳。除此之外,我同意其他人的看法,除非插入应用程序中看到的时间戳并共享要插入的时间戳,否则使用多线程无法以高分辨率获得准确的时间戳。当然,这将线程的警告问题抛到了窗外。这就像说,我要共享这些数据,但我不想使用互斥体,因为一旦另一个线程遇到锁(),互斥体就会停止处理它。

如果要在插入的多行上具有相同的时间戳;您应该创建一个SQL线程,该线程将在一个查询中执行多行插入,这将允许您获得相同的时间戳。除此之外,我同意其他人的看法,除非插入应用程序中看到的时间戳并共享要插入的时间戳,否则使用多线程无法以高分辨率获得准确的时间戳。当然,这将线程的警告问题抛到了窗外。这就像说,我要分享这些数据,但是