我创建了两个(或更多)线程来在数据库中的表中插入数据.插入时,有一个字段CreatedDateTime
,当然,它存储记录创建的日期时间.
对于一种情况,我希望线程保持同步,以便它们的CreatedDateTime
字段具有完全相同的值.使用多线程测试时,通常我有不同的毫秒数...
我想在我的系统中测试不同的场景,例如:
1)冲突插入记录同时完全冲突.
2)订购/选择记录的问题.
3)数据库连接池的问题.
4)多个用户(百)同时访问的问题.
可能还有其他测试用例我没有在这里列出.
是的,这就是发生的事情.即使是一些自然界的怪物,你的线程也会在同一时间开始,它们很快就会因为它们之间的资源争用而失败(至少可以访问数据库表或DBMS服务器进程).
如果它们大部分保持步调(即,从不超过几毫秒),只需为CreatedDateTime字段选择不同的"分辨率".把它在到最接近的10 个第二(或第二),而不是毫秒.或者以其他方式使用固定值.
否则,只要意识到这是完全正常的行为.
并且,正如BC在评论中指出的那样,您可能会误解"同步"一词的使用.它(在Java中,我希望C#类似)用于确保两个线程不会同时访问同一个资源.实际上,它几乎可以保证线程不会保持同步,因为您理解术语的意思(我个人认为您的定义在英语使用方面是正确的(同时发生的事情),但是某些计算机语言已经定义了他们自己的目的).
如果您正在测试特定时间戳进入数据库时会发生什么,那么您不能依赖于按特定顺序和特定时间安排的线程"表现自己".你真的需要以某种方式虚拟数据,否则就像试图将果冻钉在树上(或训练猫).
一种解决方案是不使用诸如getCurrentTime()
或之类的东西,now()
而是使用具有已知时间戳的特定插入集.根据您的实际架构,这可能很困难(例如,如果您只是调用一个API,它本身的时间戳为毫秒级分辨率).
如果您控制填充时间戳列的实际SQL,则需要将其更改为使用预先计算的值而不是now()
等效值.