2010-03-26 71 views
1

我有一個Web應用程序,其中有一個名爲'Data'的頁面。許多人會在給定時間嘗試將數據插入表中。因此,除主鍵以外的參考將被複制,不應該被允許。爲了將數據插入到數據庫表中,我在SQL中使用了一個存儲過程。在我的vb.net web應用程序中,我使用企業層和企業庫來調用存儲過程。現在我想鎖定表格進行插入,這樣當多個用戶插入時,就不會有任何複雜性。我怎樣才能做到這一點?請指教。如何鎖定表中插入sql?

我並不是指主鍵。我有一個主鍵字段,即不重複的InvoiceID。但隨着我需要一個'發票否',不應該重複。這是從先前輸入的'InvoiceNo'+ 1自動填充的,當多個用戶試圖同時插入時,這將被複制。

關注

+1

...你真的*見過*主鍵有這樣的重複嗎? – 2010-03-26 09:56:25

+1

你能否提供存儲過程和表格模式?如果你不知道該怎麼做,那就問。 (注意:只需編輯你的問題,上面有額外的信息)。 – 2010-03-26 10:00:38

+0

我並不是指主鍵。如果我使用過,「除主鍵以外的其他參考將被複制,不應該被允許」 – Nandini 2010-03-26 10:01:40

回答

1

您擔心什麼併發症?併發INSERT通常工作正常,沒有任何明確的鎖定。

0

你能否澄清一下這個問題。也許我只是不理解它。但是,如果您在數據庫中設置了具有標識插入的主鍵,則可以根據需要隨意調用插入存儲過程(在合理範圍內),並且SQL Server將確保每一個都插入OK。只要你不太擔心他們插入的確切順序或類似的東西。

如果你開始鎖定表,你開始得到timout問題和等待問題。更好的辦法是把所有東西都扔在SQL Server上,讓它處理所有的插入操作 - 它不僅能爲你做到這一點。

道歉,如果沒有回答這個問題。

3

不要。甚至不要去想它。你會殺了你的任何性能和併發性。

你需要找出爲什麼你有重複的PK值。如果您將其留給數據庫本身來處理,那麼通過使用INT IDENTITY列來實例,您不必擔心任何事情。 SQL Server將負責確保這些值確實始終保證是唯一的。

真的,建議是:重新設計您的解決方案,讓數據庫處理ID的唯一性 - 那麼您根本就沒有任何需要任何鎖定或任何東西。

+0

不,我已經在表中有一個主鍵。現在我沒有告訴那件事。我需要一張發票否則不應該複製的主鍵。 – Nandini 2010-03-26 10:07:27

+0

@Nandini:然後創建字段「InvoiceNo」作爲INT IDENTITY – 2010-03-26 10:08:59

+0

我已經使用@Identity作爲主鍵 – Nandini 2010-03-27 08:13:08

0

我完全理解處理會計師誰不希望顯示給客戶的發票號碼作爲主鍵 - 不會驚訝地發現你的「發票號碼」實際上應該是一個字符串組成例如,客戶#然後是破折號,然後是他們的發票號碼,或者類似的東西。也許你可以使用一個額外的表格,而不是你的發票表格中的插入觸發器。唉,你必須允許觸發器減慢插入到光標級別的性能;但是我所知道的大多數發票業務案例都不會在關鍵和次分鐘時間限制的情況下同時生成大量發票。你會做這樣的事......

創建表invoiceNumbers(invNumber INT NOT NULL標識主鍵)

然後你會做的,而不是INSERT觸發器在您的發票表將通過插入表格迭代用遊標;對於每一行,它將在invoiceNumbers上插入一個新行,檢索scope_identity()值,然後將發票(包含新發票號)插入發票表中。這會減慢你的發票插入一些,但你不會讓自己陷入併發問題,恕我直言比遊標速度而不是設置邏輯速度問題更糟糕。