2010-03-26 46 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()值,然后将发票(包含新发票号)插入发票表中。这会减慢你的发票插入一些,但你不会让自己陷入并发问题,恕我直言比游标速度而不是设置逻辑速度问题更糟糕。