我有一個Web應用程序,用戶通過單擊按鈕「加入」進行註冊。網站上可能有這麼多用戶,這就是爲什麼爲了快速保持我的數據庫查詢的原因;我選擇不在數據庫中添加foriegnkey約束(雖然它是關係數據庫)。如何防止Web應用程序中的競爭條件
現在會發生什麼情況是,當具有相同userId的用戶在兩個不同的瀏覽器中打開應用程序並同時完全打開「加入」按鈕時;兩行爲同一用戶添加到數據庫中是錯誤的。
我必須停止這樣做的想法是:
- 不要在存儲過程和使用SQL事務隔離級別爲Serializable事務中的支票/插入邏輯;但即使兩個不同的用戶同時點擊「加入」按鈕,該方法也會被鎖定。
- 在c#中使用lock關鍵字,並從裏面執行檢查/插入邏輯,但我相信如果來自兩個瀏覽器的同一個用戶他們將獲得自己的鎖,並且仍然能夠在數據庫中擁有兩個條目。對於不同的用戶,它可能會產生問題,因爲其他代碼將等待第一個用戶釋放資源。
- 使用由EntityFramework支持的開放式併發性,但我不確定它是否能解決我的問題。
你能幫我解決嗎?
你可以創建一個插入觸發器,它首先檢查id。如果存在,則從SQL中拋出一個錯誤,該錯誤應該傳播到堆棧中供您在前端處理。 – bilpor