2010-12-20 54 views
0

我是我公司的人,试图解决coldfusion错误和错误。我们每天会收到有关coldfusion错误等详细信息的电子邮件,以及我们将这些信息存储在我们的数据库中。我得到持久但间歇性的“违反主键约束”错误

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

在我们尝试执行插入操作之前,我们总是检查数据库中是否存在行,但仍然会生成该错误。

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

这些编码标准的ColdFusion风格/框架。这是伪代码中的一个例子。

CFQUERY名称= “check_sometable” 数据源= “#DSN#” 从 选择ID sometable /CFQUERY

如果check_sometable.recordcount GT 0 -do插入 别的 -do更新 /ENDIF

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

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

我们是否得到了所有这些,因为我们没有在ColdFusion 8标准的最新固定版本?

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

谢谢。

+0

这个错误发生在各种各样的表中,所有的人都有主键。但是,例如,发生此错误的表中有一个表有3个主键:company_id,user_id和course_id,整数,标识字段。 – crosenblum 2010-12-20 16:41:57

+0

可能是“check_sometable”查询的问题。 – eapen 2010-12-20 22:49:27

+0

你为什么这么喋喋不休,我对答案做了更多的研究。这对你来说不是很好。 – crosenblum 2010-12-22 05:52:43

回答

3

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

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

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

+0

什么是自然vs替代关键?我的可用选项不包括修改现有的表,我可以对我的coldfusion代码进行更改,该代码对表进行查询,但这是我真正能做的。 – crosenblum 2010-12-20 16:43:07

+0

代理键通常是一个在数据库中自动生成的整数(首选方式),或者通过一些代码找到最后一个代码,并告诉用户要使用新代码(通常是错误的方式,如果结果不正确竞赛条件)。 – HLGEM 2010-12-20 16:46:47

+0

自然钥匙是一些数据值,被认为是独一无二的,例如汽车的VIN号码或社会安全号码。 – HLGEM 2010-12-20 16:47:28