问题描述:
我在主线程中使用Quartz去同时两个Job(也就是同时开启子线程)。这两个Job有一部分运行逻辑相同,因此,我将这部分代码写成静态函数,让这两个Job去调用这个静态函数。而这个静态函数中,由于业务需要,存在for循环插入数据库的同一张表。此时代码会循环调用Guid.NewGuid()。
在运行过程中,日志输出,偶尔会出现主键重复的报错。
分析:
我猜测,Guid.NewGuid() 底层函数,会去内存的静态数据区操作同一块内存空间。
估计是多线程条件下这块空间的加锁方式或者进入临界区的方式有问题。这里先记录一下,以后慢慢分析
解决方案:
避免这个写法即可:将这个静态函数写成两个Job的内部成员函数。
参考:
C# Guid.NewGuid()生成的GUID重复,怎么解决?