枝
枝上柳绵
Unregistered / Unconfirmed
GUEST, unregistred user!
我做了一个进销存的系统,其中里面的这样一个销售的存储过程,我怎么改都觉得还有问题,请大家指点一些,特别是做过类系统的高手,谢谢<br>--select * from 销售单明细<br>--AS<br>declare @t1 table<br>(<br>[货号] nvarchar(50),<br>[库存数量] int<br><br>)<br>declare @t2 table<br>(<br>[货号] nvarchar(50),<br>[库存数量] int<br><br>)<br>declare @SALeno nvarchar(50),<br><br> @udt_error int, @ins_error int<br>--我希望能在这里加上<br>--set transaction isolation level tablockx <br>--SET TRANSACTION ISOLATION LEVEL<br> -- { READ COMMITTED<br>-- | READ UNCOMMITTED<br> -- | REPEATABLE READ<br> -- | SERIALIZABLE <br> -- }<br>--但是帮助里没有这个选项,第一个是事务默认的<br>--不知道这个能满足要求吗<br>--set tran isolation level SERIALIZABLE<br>--tablelockx可以防止其它事务读取或更新表,并在语句或事务结束前一直持有<br>--SERIALIZABLE 在数据集上放置一个范围锁,以防止其他用户在事务完成之前更新数据集或将行插入数据集内。这是四个隔离级别中限制最大的级别。因为并发级别较低,所以应只在必要时才使用该选项。该选项的作用与在事务内所有 SELECT 语句中的所有表上设置 HOLDLOCK 相同。<br><br>--但是就怕一是产生死锁,二是我不知道默认的能否保证更改库存时不会让其他事务读取它<br>--因为可能很多人同时销售产品<br>begin transaction<br>set @SALeno='111111111'<br>insert @t1(货号,库存数量)--更改库存前的库存数量<br>select a.货号,库存数量<br>from 库存库 a join 销售单明细 b<br>on a.货号=b.货号<br>where 销售单号=@saleno<br><br>UPDATE 库存库 SET 库存数量=库存数量-数量<br> FROM (SELECT 货号,'数量'=sum(销售数量) FROM 销售单明细 where 销售单号=@saleno<br> GROUP BY 货号) AS LSJ<br> WHERE 库存库.货号=LSj.货号<br><br><br>insert @t2(货号,库存数量)--更改库存后的库存数量<br>select a.货号,库存数量<br>from 库存库 a join 销售单明细 b<br>on a.货号=b.货号<br>where 销售单号=@saleno <br>-- select * from @t1<br>--select * from @t2<br> <br>if(select tstore.销售数量-tsale.销售数量 --如果库存变化数量与销售数量相等<br>from<br>(select t1.货号 ,(t1.库存数量-t2.库存数量)销售数量 from @t1 t1 join @t2 t2<br>on t1.货号=t2.货号)as tstore<br>inner join <br>(select 货号,销售数量<br>from 销售单明细 <br> <br>where 销售单号=@saleno ) as tsale<br>on tstore.货号=tsale.货号)=0<br>print 'succ'<br>commit tran<br>else<br>print 'error'<br>rollback tran<br><br>我想里面再用表级锁定,但是怕死锁产生,所以一直不敢用...<br>请大家指点一下还有没有不完整的,没有考虑到的,还有突发事件会产生错误的,等等...