日期:2014-05-18  浏览次数:20603 次

共享锁与排它锁
我这里有一个存储过程,请高手指点:我该如何写语句,加行级锁,主要是排他锁,使得sql语句能够避免并发操作.
CREATE   PROCEDURE   a_ADD

@prescriptionid   varchar(12)   ,

@medicineid   varchar(8)   ,
@amount   numeric(9,2)
as  
      Begin   Transaction
          insert   into   a(prescriptionid,medicineid   ,amount)   values(@prescriptionid,@medicineid,@amount)
            If   @@Error   <>   0   RollBack   Transaction    
            update   medicineinfo   set   amountofusing=amountofusing-@amount   where   medicineid=@medicineid
            If   @@Error   <>   0     RollBack   Transaction      
            Commit   Transaction
各位高手多多帮忙.谢谢了


------解决方案--------------------
with(rowlock)
------解决方案--------------------
with(nolock)

------解决方案--------------------
如果每次修改一条或者少量的行,根本没有必要指定锁,因为SQL SERVER能够很好的控制该用什么锁,这样可以达到性能和并发的最佳平衡。
如果修改的数据量较大,可以使用下边的办法来防止SQL SERVER锁升级(行锁升级为页锁或表索)而影响并发:
set rowcount 50
update more:
update 语句……
if @@rowcount > 0
goto update more
set rowcount 0

每次修改数据时,要让事务执行的时间尽可能的短一些,事务就不会长时间的占用排他锁而影响并发。