2013-07-19 57 views
1

我正在開發用於預訂或預訂的系統。在我的表單中,我打了一個ajax調用來檢查是否有可用空間,如果它們已滿,則禁用它們。不幸的是有這樣的情況有1個可用空間和10試圖提交的響應,它超過了1或2根據當前值防止在數據庫中插入

分配的空間,我不希望這可怎麼防止任何代碼或查詢,但指導原則?

+0

如何設計你的數據庫? –

回答

0

您無法實現與客戶端技術的可靠同步,您將不得不深入瞭解堆棧。 您應該在稍後階段推遲此檢查,並在服務器端(以java,c#等)或存儲過程進行處理。 使用您的JavaScript進行初步檢查:如果沒有可用空間,請立即禁用表單。但是,如果有可用空間,表單將顯示爲啓用狀態,但稍後可能會在您的java代碼或存儲過程中失敗。這個階段應該是同步的,如果你發現有任何空間,因爲你只是提供服務的顧客,返回錯誤消息的休息,即使他們已經看到啓用形式。

+0

我的onload()中檢查以禁用按鈕,那麼當用戶點擊單選按鈕另一個AJAX調用。我沒有使用存儲過程,但使用java中的批量sql來上傳信息。這就是當我體驗,即使這些檢查後,當數超過1至3 –

+0

重要的是要了解爲什麼這些檢查都沒有足夠的能力,我有一個情況。看看交易是什麼。 http://www.sqlteam.com/article/introduction-to-transactions http://en.wikipedia.org/wiki/Database_transaction我不知道什麼是SQL批處理,但它會非常方便地將您的業務邏輯在存儲過程中。 –

0

在互斥事務中包裹「有空間可用/預留空間」,以便最多一個客戶端可以檢查/預留空間。是的,許多請求將等待,但如果關鍵部分很小,整個等待時間將可以忽略不計。

0

我想鎖定部分在數據庫中完成。 通讀事務提供的許多隔離級別對於此特定部分,可重複讀取應該解決此問題。 旨在確保數據庫即使對於讀取操作也能獲取鎖定。 您可以爲此編寫一個存儲過程,或者甚至可以在應用程序層執行此操作。 不要忘記在完成後重置交易級別。