难道Guid也会重复???

shuguangleo 2010-11-16 03:02:17
写了10个线程,每个线程里有一个whil循环循环200次,向数据库里查数据,每条数据有自己的主键都是Guid.NewGuid().ToString();

10个线程一起运行,运行一定时间总会提示约束冲突,调试时发现,产生了重复的Guid,因此插入的时候报错。

难道Guid这么容易重复????这个问题怎么解决?
...全文
1398 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
qzx123 2011-01-15
  • 打赏
  • 举报
回复
GUID是以机器和时间为限制生成的 LZ使用多线程的时候应该知道多线程的意思就是多个线程并发执行 既然是并发那就有可能出现多个线程同时进行的情况 这样就不难理解为什么LZ生成的GUID会重复了 这个问题在单核单CPU情况下应该是不会出现的
csz_1987 2010-11-17
  • 打赏
  • 举报
回复
phil999 2010-11-16
  • 打赏
  • 举报
回复
因为是多线程,很可能是同步没做好读到了重复的guid,而不是生成的guid重复。加个调试语句:

string str = Guid.NewGuid().ToString();
Debug.WriteLine(str);

看看输出窗口写出guid重复不重复

特别 2010-11-16
  • 打赏
  • 举报
回复
GUID出现重复并不是什么大惊小怪的事情,只不过概率稍低而已
烈火蜓蜻 2010-11-16
  • 打赏
  • 举报
回复
说那么多没用,把代码弄出来看一下吧
colorall 2010-11-16
  • 打赏
  • 举报
回复
绝对不会重复的,代码写的肯定有问题,不信把代码贴出来。
hyblusea 2010-11-16
  • 打赏
  • 举报
回复
在单核CPU上的计算机开多线程,几乎是不会出现重复的
夜归人 2010-11-16
  • 打赏
  • 举报
回复
GUID重复,用VS自带的GUID工具重新生成一个GUID就可以了啊
air123456789 2010-11-16
  • 打赏
  • 举报
回复
不是程序外 是线程外。
air123456789 2010-11-16
  • 打赏
  • 举报
回复
guid字符串定义写在了 程序外 然后 在线程里赋值了? 我之前发生过类似的错误。
shuguangleo 2010-11-16
  • 打赏
  • 举报
回复
大家似乎没明白我的意思。
情况就是:
10个线程无优先级的往10个不同的表里插数据,每个线程都随进生成guid。结果是开的线程越多,某个线程就越会出现往自己表里插重复guid的现象。
shuguangleo 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 yuxianye1 的回复:]
楼主应该知道guid生产的原理是什么吧
机器、 网卡等的硬件编码 还有当前的时间
线程多了可能同时执行,产生的guid可能相同

十个线程对应十个不同的表也有重复。这个问题没搞清楚,具体guid生产根据时间的值的精度不知道
[/Quote]

不同表里有重复不要紧啊。同一表里为什么会有重复。

就选线程A和线程B在莫一时刻生成了两条一模一样的guid,可这两个一样的guid在两个不同的表里。
我现在情况是:在同一表里很容易生成同样的guid,导致无法插入数据。
shuguangleo 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 linux7985 的回复:]
引用 6 楼 shuguangleo 的回复:
但是,我这10个线程对应10个不同的数据库表,不同表中重复了没关系,为什么同一表中也会这么容易出现重复值???


只能说,无语、

GUID是不同的机器以及不同的时间才不会出现重复,
而你的环境是什么?

相同的机器,而且你还开发10个线程,
在DateTime最小的时间单位内,都很有可能同时执行NewGuid()的方法,能不重……
[/Quote]

是,可能某一时刻两个想成同时执行NewGuid()的方法,但两个线程对应的是两个不同的表。同表中怎么可能有重复?
yuxianye1 2010-11-16
  • 打赏
  • 举报
回复
楼主应该知道guid生产的原理是什么吧
机器、 网卡等的硬件编码 还有当前的时间
线程多了可能同时执行,产生的guid可能相同

十个线程对应十个不同的表也有重复。这个问题没搞清楚,具体guid生产根据时间的值的精度不知道
  • 打赏
  • 举报
回复
这个
烈火蜓蜻 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 shuguangleo 的回复:]
但是,我这10个线程对应10个不同的数据库表,不同表中重复了没关系,为什么同一表中也会这么容易出现重复值???
[/Quote]

只能说,无语、

GUID是不同的机器以及不同的时间才不会出现重复,
而你的环境是什么?

相同的机器,而且你还开发10个线程,
在DateTime最小的时间单位内,都很有可能同时执行NewGuid()的方法,能不重复吗?
guojh021 2010-11-16
  • 打赏
  • 举报
回复
你的程序有问题。
shuguangleo 2010-11-16
  • 打赏
  • 举报
回复
但是,我这10个线程对应10个不同的数据库表,不同表中重复了没关系,为什么同一表中也会这么容易出现重复值???
shuguangleo 2010-11-16
  • 打赏
  • 举报
回复
但是,我这10个线程对应10个不同的数据库表,不同表中重复了没关系,为什么同一表中也会这么容易出现重复值???
shuguangleo 2010-11-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fellowcheng 的回复:]
guid的算法和当前时间有关系,可能是guid重复的原因
[/Quote]
我估计也是,我发现开的线程越少,重复的几率越低,开的越多,重复几率越大。
加载更多回复(4)

111,097

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧