当前位置:  开发笔记 > 编程语言 > 正文

如何让两个线程将特定时间戳插入表中?

如何解决《如何让两个线程将特定时间戳插入表中?》经验,为你挑选了1个好方法。

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

对于一种情况,我希望线程保持同步,以便它们的CreatedDateTime字段具有完全相同的值.使用多线程测试时,通常我有不同的毫秒数...

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

1)冲突插入记录同时完全冲突.

2)订购/选择记录的问题.

3)数据库连接池的问题.

4)多个用户(百)同时访问的问题.

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



1> paxdiablo..:

是的,这就是发生的事情.即使是一些自然界的怪物,你的线程也会在同一时间开始,它们很快就会因为它们之间的资源争用而失败(至少可以访问数据库表或DBMS服务器进程).

如果它们大部分保持步调(即,从不超过几毫秒),只需为CreatedDateTime字段选择不同的"分辨率".把它在到最接近的10 第二(或第二),而不是毫秒.或者以其他方式使用固定值.

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

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

如果您正在测试特定时间戳进入数据库时​​会发生什么,那么您不能依赖于按特定顺序和特定时间安排的线程"表现自己".你真的需要以某种方式虚拟数据,否则就像试图将果冻钉在树上(或训练猫).

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

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

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有