2011-04-15 127 views
0

我的设置 - 一台服务器包含两个SQL Server 2000实例INSTANCE1和INSTANCE2。每个实例都有1个DB,DBprod和DBstag。SQL Server 2000独占锁定

我有一种情况,我需要为几个客户准备发票,所以我想在表格上放置一个排它锁,同时我从INSTANCE1.DBprod.LastInvoiceNumber获取一个发票号码到INSTANCE2.DBstag,执行soem计算,准备发票,然后将发票(标题和明细)插入到INSTANCE1.DBprod中,然后更新INSTANCE1.DBprod.LastInvoiceNumber,为下一个客户重复,然后在完成所有客户后释放锁。

开始反式INV

独占锁定 INSTANCE1.DBprod.LastInvoiceNumber

开放客户光标

从 INSTANCE1.DBprod.LastInvoiceNumber下次提取从客户

获得发票号码

制备发票

插入发票INSTANCE1.DBprod

更新 INSTANCE1.DBprod.LastInvoiceNumber (由1增量)

从顾客下一个取指令(准备下一个 客户发票)

靠近客户光标

commit trans inv

释放锁ON INSTANCE1.DBprod.LastInvoiceNumber

这会是我的解决方案

SET事务隔离级别 SERIALIZABLE

有使用INSTANCE1.DBprod的会计应用.LastInvoiceNumber这就是为什么我想完全锁定表格,直到我完成发布所有发票。

回答

0

最简单的方法之一是使用sp_getapplock只允许一个会话。其他会话将等待/失败

这与锁粒度和隔离无关,在这种情况下它通常更好。使用SERIALIZABLE不是唯一的:你需要TABLOCKX。但随后表格上的其他读者也被阻止

sp_getapplock仅适用于此代码的范围。

+0

我正在通过存储过程准备发票。我的意图是阻止所有应用程序使用INSTANCE1.DBprod.LastInvoiceNumber,直到我完成发布所有发票为止......我会研究您的建议。 – 2011-04-15 18:53:32