(求助)并发造成单据重复如何解决?
t_BillCodeRule表存单据类型及各单据类型(如出库单)的最大单据编号的数字部分,比如00235
ICBillNo表存各单据类型最大单据的完整编号,比如TX00235
生成编号时是先从t_BillCodeRule表取出库单类型的最大编号。并储存在临时字段中,值是TX00235
再将00235+1的值00236写回t_BillCodeRule表
再将TX00236写回ICBillNo表
再将包括TX00235在内的信息返回供其他存储过程使用。
语句是:
CREATE procedure [dbo].[GetBillNo]
@Billtypeid int,
@Projectid int,
@FBillno nvarchar(20) OUTPUT
as
BEGIN TRANSACTION
Begin
Declare @TmpID nvarchar(10)
Declare @billno nvarchar(10)
Declare @qianz nvarchar(10)
SET @TmpID = (SELECT FID FROM t_BillCodeRule WITH(READUNCOMMITTED)
WHERE fbilltypeid=@Billtypeid and fprojectid=@Projectid)
select @qianz=Fprojectval FROM t_BillCodeRule WITH(READUNCOMMITTED)
WHERE fbilltypeid=@Billtypeid and fprojectid=1
update t_billcoderule with(rowlock) set fprojectval = fprojectval+1,
flength=case when (flength-len(fprojectval)) >= 0 then flength else len(fprojectval) end where FID = @TmpID
Update ICBillNo with(rowlock) Set FCurNo = (select top 1 isnull(fprojectval,1)
from t_billcoderule where FID = @TmpID) where fbillid = @Billtypeid
select @billno=left('0000000000',Flength-len(Fprojectval))+Fprojectval from t_billcoderule where FID = @TmpID
Update ICBillNo with(rowlock) Set FDesc = @billno Where FBillID = @Billtypeid
select @FBillno=@qianz+@billno
End
commit TRANSACTION
相关推荐
PHP实现Redis单据锁以及防止并发重复写入
一、写在前面: 在整个供应链系统中,会有很多种单据(采购单、入库单、到货单、运单等等),在涉及写单据数据的接口时(增删改操作),即使前端做了相关限制,还是有可能因为网络或异常操作产生并发重复调用的情况,导致对相同单据做相同的处理; 为了防止这种情况对系统造成异常影响,我们通过Redis实现了一个简单的单据锁,每个请求需先获取锁才能执行业务逻辑,执行结束后才会释放锁;保证了同一单据的并发重复操作请求只有一个请求可以获取到锁(依赖Redis的单线程),是一种悲观锁的设计; 注:Redis锁在我们的系统中一般只用于解决并发重复请求的情况,对于非并发的的重复请求一般会去数据库或日志校验数据的状态,两
何为Redis单据锁,如何防止并发重复写入的
何为Redis单据锁,如何防止并发重复写入的 在整个供应链系统中,会有很多种单据(采购单、入库单、到货单、运单等等),在涉及写单据数据的接口时(增删改操作),即使前端做了相关限制,还是有可能因为网络或异常操作产生并发重复调用的情况,导致对相同单据做相同的处理; 为了防止这种情况对系统造成异常影响,我们通过Redis实现了一个简单的单据锁,每个请求需先获取锁才能执行业务逻辑,执行结束后才会释放锁;保证了同一单据的并发重复操作请求只有一个请求可以获取到锁(依赖Redis的单线程),是一种悲观锁的设计; 注:Re
详解java解决分布式环境中高并发环境下数据插入重复问题
主要介绍了java解决并发数据重复问题 ,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
记一次 MySQL 并发时插入重复数据的解决方案
问题描述 首先,看一下我的表结构。 CREATE TABLE `coolq_qq_group_message_receiver` ( `id` int(11) NOT NULL AUTO_INCREMENT, `qq_group_number` varchar(12) NOT NULL COMMENT 'QQ群号码', `qq` varchar(12) NOT NULL COMMENT '酷Q接收者QQ号', `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `created_
java并发访问重复请求过滤问题
本篇文章给大家分享了关于java并发访问重复请求过滤的相关问题以及解决方法,对此有需要的朋友参考学习下。


