我持续但间歇性的“违反PRIMARY KEY约束”错误

时间:2010-12-20 16:19:29

标签: sql-server-2008 coldfusion coldfusion-8

我是我公司中试图解决冷血错误和错误的人。我们每天都会收到有关coldfusion错误等详细信息的电子邮件,我们也会将这些信息存储在我们的数据库中。

对于ColdFusion中的一些不同应用程序,它们似乎偶尔会生成“违反PRIMARY KEY约束”错误。

在我们尝试进行插入之前,我们总是在代码中检查数据库中是否存在行,并且它仍然会生成该错误。

所以我的想法是,我们需要围绕这些检查,插入或更新块进行cftransaction。但我不确定这会真正解决问题。

这些是用标准的coldfusion样式/框架编码的。这是伪代码中的一个例子。

cfquery name =“check_sometable”datasource =“#dsn#” 选择ID 从某些人 / CFQUERY

如果check_sometable.recordcount gt 0 - 插入 其他 - 更新 / ENDIF

那为什么会间歇性地导致主键违规?

这是一个sql server问题,我们是否缺少配置选项?

我们是否得到了所有这些因为我们没有使用最新的hotfusion 8标准的hotfixed版本?

我们是否需要升级我们的jdbc / odbc驱动程序?

谢谢。

1 个答案:

答案 0 :(得分:3)

听起来像我的竞争条件。两个连接同时检查下一个可用的id,获取相同的ID,然后插入在第二个上失败。如果它是代理键,为什么不使用标识字段来创建PK?

如果您的PK是自然键,那么违规是一件好事,您有两个用户试图插入您不想要的相同记录。我会尝试优雅地失败,但有一个错误,说别人创建了相同的记录。然后询问是否要在将新值加载到其屏幕后更新它。我不确定我是否希望它设置,以便第二个人自动更新数据,而不会看到第一个人放入数据库的内容。

此外,这可能表明您的自然键并不像您认为的那样独特。不确定这个应用程序做了什么,但两个人想要同时使用相同数据的可能性有多大?因此,如果您的自然密钥类似于公司名称,请注意它们不能保证是唯一的,并且您可能让用户为一家公司覆盖了包含另一家公司数据的良好数据。我发现在生活中真的很少有真正独特的,永不改变的自然键。因此,如果您的自然键确实不是唯一的,那么您可能已经有了错误的数据,并且PK违规只是一个不同问题的症状,而不是真正的问题。