2011-04-27 70 views
1

我一直在面對這個問題很長一段時間。與SQL事務和ROWLOCKS混淆ASP.net C#

我的窗體上有兩個按鈕。 btnNEXT,btnSUBMIT ..

當用戶點擊btnNEXT時,會顯示下一條記錄的詳細信息。然後用戶輸入一些數據並點擊btnSUBMIT。此操作將更新該特定記錄的詳細信息。

現在,我有大約10個用戶在使用它。當用戶1點擊btnNEXT時,他會得到一條記錄進行修改。現在我想讓該記錄被鎖定,並且沒有其他用戶可以看到該記錄。當User1輸入詳細信息並單擊btnSUMBIT時,記錄將被更新並鎖定將被釋放。其他場景: 用戶1單擊btnNEXT。那麼記錄將被鎖定。如果用戶在不更新任何數據的情況下關閉應用程序,則應解除記錄。

我做了什麼: 的begin tran選擇頂層1 *從(UPDLOCK,READPAST),其中條件

更新表中設置A = 1,B表= 2其中id = 123提交TRAN

以上查詢滿足我對鎖定和解鎖行的條件。但我想開始btnNEXT_Click事件中的事務並在btnSUMBIT_Click事件中提交事務

我該如何實現這一目標?..我無法超越此目的去思考。如果你有一個能滿足我的整個場景

非常感謝

+0

你可以使用樂觀鎖嗎?請參閱:http://stackoverflow.com/questions/129329/optimistic-vs-pessimistic-locking。如果你仍然真的想要使用悲觀鎖定,你可以使用類似專用的「鎖定」表格,但是當「交易」未完成時,需要某種方式來解鎖項目。 – 2011-04-27 06:34:18

+0

在SQL服務器中持續鎖定不確定時間是災難的祕訣......由於@moe說鎖定表可能是一個好的解決方案 – 2011-04-27 12:59:31

回答

0

這是一個無狀態的應用程序中固有的問題,任何其他請諮詢我。如果用戶放棄會話,只需走開或簡單地關閉瀏覽器,就沒有好方法知道肯定會話應該關閉。我提出的最佳解決方案是使用時間戳作爲鎖定字段,然後定期輪詢已鎖定時間過長的記錄。不是一個完美的解決方案,但它應該解決90%以上的問題。從OP評論後

編輯:

@ARB,交易被用來執行可能潛在需要回滾SQL語句序列。它通常保留用於保存操作(插入,更新&刪除)。你不能「回滾」一個選擇語句(沒有任何「撤銷」)。因此,不需要在包含事務的btnNext操作(select)和btnSubmit操作。另外,當我使用事務時,它已經以單個命令序列的形式出現。我不能說我知道你不能在中間加入交易,但我從來沒有見過它完成。根據保存函數的複雜性,以下btnSubmit可能是使用事務的好地方,但只有在保存到多個表時纔有效。

總結

由於Web應用程序的無狀態特性,並且不能「強制」用戶關閉他們的會話的「優雅」你需要一個機制,「解鎖」,有一個記錄被鎖定時間過長。

因爲在你的btnNext動作(選擇命令)中沒有任何東西可以「回滾」,所以沒有理由在事務中包含這個動作。如果你想隔離你的btnSubmit(保存動作),那麼這可能是有用的。

+0

您好,謝謝您的回覆。但我怎麼能在btnNEXT_Click事件中開始一個事務並在btnSUBMIT_Click事件中提交..請給我一些示例代碼,如果你有 – ARB 2011-04-27 06:19:06