问题描述
|
我的设置-一台具有两个SQL Server 2000实例(INSTANCE1和INSTANCE2)的服务器。每个实例具有1个DB,DBprod和DBstag。
我有一种情况,我需要为几个客户准备发票,因此我想在桌子上放一个排他锁,同时从INSTANCE1.DBprod.LastInvoiceNumber到INSTANCE2.DBstag提取发票编号,执行定律计算,准备发票并然后将发票(标题和详细信息)插入INSTANCE1.DBprod,然后更新INSTANCE1.DBprod.LastInvoiceNumber,为下一个客户重复,然后在我与所有客户联系完毕后解除锁定。
开始反式
独家锁定
INSTANCE1.DBprod.LastInvoiceNumber
打开客户游标
从客户那里获取下一步
从获取发票号
INSTANCE1.DBprod.LastInvoiceNumber
准备发票
将发票插入INSTANCE1.DBprod
更新
INSTANCE1.DBprod.LastInvoiceNumber
(增加1)
从客户获取下一个(准备下一个
客户发票)
关闭客户游标
提交反邀请
释放锁定
INSTANCE1.DBprod.LastInvoiceNumber
这是我的解决方案
设置交易隔离级别
可序列化
有一个使用INSTANCE1.DBprod.LastInvoiceNumber的会计应用程序,这就是为什么我要独占锁定表,直到我完成所有发票的发布。
解决方法
最简单的方法之一是使用sp_getapplock仅允许一个会话。其他会话将等待/失败
这与锁的粒度和隔离无关,在这种情况下通常更好。使用SERIALIZABLE并非唯一:您需要TABLOCKX。但是后来桌上的其他读者也被封锁了
sp_getapplock仅适用于此代码的范围。