2012-12-06 67 views
0

我是新的C#,有一個這樣的問題:鎖定DB記錄插入只發生一次

我有一個.aspx頁面,接受一個參數eventId

在第一次請求這個頁面時,特定的eventId,我需要在數據庫中插入一些對該事件唯一的行。

所有其他時間頁面請求與該eventId,不應該插入行。

我可以查詢數據庫以查看這些行是否已經存在,但這不會阻止併發問題。

也就是說,2個客戶端完全同時請求eventId = 7的頁面 - 該事件的行可能會插入兩次。

如何使用Mutex /鎖定/監視器或其他任何東西來避免這種情況?

我需要鎖定機制,由一個字符串標識 - 事件ID

在此先感謝...

+0

你說下面你插入30條記錄?你怎麼做到這一點?一次一個?你能發佈你的代碼嗎? – aquinas

+0

我一次做到這一切 – koela1

回答

1
在你的數據庫創建基於事件ID的唯一指標

。在您的asp頁面上總是插入並處理插入失敗的情況。如果插入失敗,事件ID已被其他人使用。在這個設計中,db執行同步。

+0

這對我不好,因爲我爲每個事件插入了大約30條記錄到一張表。因此事件ID不能用作索引 – koela1

+0

只用事件ID作爲列加上唯一索引來創建新表。 – opi

+0

這是一個好主意!非常感謝 – koela1

0

如果事件ID已經存在,則閱讀「插入該事件ID」方法應在事務中運行。 如果您使用TransactionScope,則可以將隔離級別設置爲Serializable,這將確保您永遠不會在數據庫級別具有併發訪問權限,因此可以防止插入兩次事件。

但是,我還會在數據庫的該字段中添加一個唯一的鍵索引,就像opi所建議的那樣。