我有一个Web应用程序,其中有一个名为“Data”的页面。许多人会尝试在给定时间将数据插入表中。因此,除了主键之外的引用将被复制,这是不允许的。为了将数据插入数据库表,我在SQL中使用存储过程。在我的vb.net Web应用程序中,我使用带有企业库的Business层来调用存储过程。现在我想锁定表格以便插入,这样当多个用户插入时,就不会有任何复杂情况。我怎样才能做到这一点?请指教。
我不是指主键。我有一个主键字段,即InvoiceID,它不重复。但与此同时,我需要一个不应该重复的“InvoiceNo”。这是从之前输入的'InvoiceNo'+ 1中自动填充的,当多个用户同时尝试插入时,它将被复制。
此致
答案 0 :(得分:3)
别。甚至不要考虑它。你会杀掉你的任何性能和并发性。
你需要找出你有重复PK值的原因。如果你把它留给数据库本身来处理,例如使用INT IDENTITY列,你真的不必担心任何事情。 SQL Server将确保确保这些值确实始终是唯一的。
实际上,建议是:重新设计您的解决方案并让数据库处理ID的唯一性 - 然后您根本不需要任何锁定或任何东西。
答案 1 :(得分:1)
您关注哪些并发症?并发INSERT通常可以正常工作而不需要任何显式锁定。
答案 2 :(得分:0)
您能否确切地澄清问题。也许我只是不理解它。但是,如果您在数据库中设置了带有标识插入的主键,则可以根据需要多次调用插入存储过程(在合理范围内),SQL Server将确保每个插入正确。只要你不太担心他们插入的确切顺序或类似的东西。
如果您开始锁定表格,则会开始出现问题并等待问题。最好把所有东西扔到SQL Server上并让它处理所有的插入 - 它能够为你做到这一点。
如果没有回答这个问题,请道歉。
答案 3 :(得分:0)
我完全理解处理不希望显示给客户的发票号是主键的会计师 - 发现你的“发票编号”实际上应该是由字母组成的字符串也不会感到惊讶比方说,客户#后跟破折号,后跟发票号或类似的东西。也许您可以使用您在发票表中而不是插入触发器内引用的附加表。唉,你必须允许触发器将插入速度降低到光标级别的性能;但我所知道的大多数发票业务案例都不会同时产生大量的发票,而且会产生严重的时间限制。你会做这样的事......
create table invoiceNumbers(invNumber int not null identity primary key)
然后你会在你的发票表上做一个而不是插入触发器,它会用光标迭代插入的表;对于每一行,它将在invoiceNumbers上插入一个新行,检索scope_identity()值,然后将发票(带有新发票编号)插入发票表中。这会减慢你的发票插入一些,但你不会陷入并发问题,恕我直言,这比光标速度而不是设定逻辑速度问题更糟糕。