2010-12-20 14 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

相關問題