修改第二个问题的方法之一,把对F_Arithmometer表的更新提前,这样锁住了F_Arithmometer表(就一条记录),能解决并发的情况,但第一个问题你要考虑清楚: DECLARE @ID INT --当明插入的单据的ID DECLARE @Fac_id SMALLINT --基地ID DECLARE @Msort_ID SMALLINT --物料类别ID DECLARE @YearNO SMALLINT --年度 DECLARE @Folio VARCHAR(15) --最终生成的单据号 SELECT @ID=ID,@Fac_id=Fac_id,@Msort_ID=Msort_ID,@YearNO=YEAR(Date) FROM Inserted UPDATE F_Arithmometer SET VALUE=VALUE+1 WHERE fact_id=@Fac_id and msort_id=@Msort_ID and YearNo=@YearNO IF @@ERROR<>0 BEGIN ROLLBACK TRANSACTION RETURN END SELECT @Folio=REPLACE(STR(Fact_id,2)+STR(Msort_ID,2)+STR(YearNo,4)+ STR (value,5),' ','0') FROM F_Arithmometer(TABLOCKX) WHERE fac_id=@Fac_id and msort_id=@Msort_ID and YearNo=@YearNO IF @@ROWCOUNT=0 --没有生成单号,回滚事务 BEGIN ROLLBACK TRANSACTION RETURN END UPDATE MINM SET Folio=@Folio WHERE ID=@ID IF @@ERROR<>0 BEGIN ROLLBACK TRANSACTION RETURN END
BEGIN SELECT @ID=ID,@Fac_id=Fac_id,@Msort_ID=Msort_ID,@YearNO=YEAR(Date) FROM Inserted ---------------------------------------------------------------------------- SELECT @Folio=REPLACE(STR(Fact_id,2)+STR(Msort_ID,2)+STR(YearNo,4)+ STR (value,5),' ','0') FROM F_Arithmometer(TABLOCKX) --锁住该表 WHERE Fac_id=@Fac_id and Msort_id=@Msort_ID and YearNo=@YearNO IF @@ROWCOUNT<>0 --没有生成单号,回滚事务 ROLLBACK TRANSACTION RETURN END ----------------------------------------------------------------------------- BEGIN UPDATE MINM SET Folio=@Folio WHERE ID=@ID IF @@ERROR<>0 ROLLBACK TRANSACTION RETURN END ----------------------------------------------------------------------------- BEGIN UPDATE F_Arithmometer SET VALUE=VALUE+1 WHERE fact_id=@Fac_id and msort_id=@Msort_ID and YearNo=@YearNO IF @@ERROR<>0 ROLLBACK TRANSACTION RETURN END
DECLARE @ID INT --当明插入的单据的ID DECLARE @Fac_id SMALLINT --基地ID DECLARE @Msort_ID SMALLINT --物料类别ID DECLARE @YearNO SMALLINT --年度 DECLARE @Folio VARCHAR(15) --最终生成的单据号SELECT @ID=ID,@Fac_id=Fac_id,@Msort_ID=Msort_ID,@YearNO=YEAR(Date) FROM Inserted SELECT @Folio=REPLACE(STR(Fact_id,2)+STR(Msort_ID,2)+STR(YearNo,4)+ STR (value,5),' ','0') FROM F_Arithmometer(TABLOCKX) WHERE fac_id=@Fac_id and msort_id=@Msort_ID and YearNo=@YearNO IF @@ROWCOUNT=0 --没有生成单号,回滚事务 BEGIN
ROLLBACK TRANSACTION RETURN END UPDATE MINM SET Folio=@Folio WHERE ID=@ID IF @@ERROR<>0 BEGIN ROLLBACK TRANSACTION RETURN END UPDATE F_Arithmometer SET VALUE=VALUE+1 WHERE fact_id=@Fac_id and msort_id=@Msort_ID and YearNo=@YearNO IF @@ERROR<>0 BEGIN ROLLBACK TRANSACTION RETURN END 上面的语句我认为没有问题 我想你的问题出在minm表里,设置一个自动加一的主键,或者你别的表的触发器涉及到了你这个触发器里的某个表.不知对不对
谢谢大家这么积极,我的MinM 表的ID是设为主键的,并且考虑到这是一个主表,在输入时每次都只是插入一条记录,因此没有考虑批量插入的情况,因而没有使用游标。 我后来发现,原来出错的原因不是这个引起,而是打印机出错提示‘已经有一个激活的事务’,操作员对我报告这个错误时,我神经过敏所致,因为我刚刚在数据库中加上了这个触发器。现经过多次测试,绝对没有问题,如有人认可此法可大胆使用。 另外,我还想请教,各位大侠在处理单号连续这个问题的时候是怎样做的,说出来交交流流也好。 To zhaohe(霹雳五号) 你说要使用 Tablockx锁住此表,我开始也是这么做的,后来有一次发现所有的用户都提示连接超时错,我花了两个小时的时间,发现就是因为锁住这个表出了问题,我也看过书上讲,事务提交或回流后将会自动解锁,可是它没有自动解锁,我只好去掉了这个锁,不知有没有什么方法能手动地在事务结束后解锁而不依赖系统。
DECLARE @ID INT --当明插入的单据的ID
DECLARE @Fac_id SMALLINT --基地ID
DECLARE @Msort_ID SMALLINT --物料类别ID
DECLARE @YearNO SMALLINT --年度
DECLARE @Folio VARCHAR(15) --最终生成的单据号 SELECT @ID=ID,@Fac_id=Fac_id,@Msort_ID=Msort_ID,@YearNO=YEAR(Date)
FROM Inserted UPDATE F_Arithmometer SET VALUE=VALUE+1 WHERE fact_id=@Fac_id and
msort_id=@Msort_ID and YearNo=@YearNO
IF @@ERROR<>0
BEGIN
ROLLBACK TRANSACTION
RETURN
END SELECT @Folio=REPLACE(STR(Fact_id,2)+STR(Msort_ID,2)+STR(YearNo,4)+
STR (value,5),' ','0') FROM F_Arithmometer(TABLOCKX)
WHERE fac_id=@Fac_id and msort_id=@Msort_ID and YearNo=@YearNO
IF @@ROWCOUNT=0 --没有生成单号,回滚事务
BEGIN
ROLLBACK TRANSACTION
RETURN
END UPDATE MINM SET Folio=@Folio WHERE ID=@ID
IF @@ERROR<>0
BEGIN
ROLLBACK TRANSACTION
RETURN
END
而且你个表里有主键吗?
DECLARE @ID INT --当明插入的单据的ID
DECLARE @Fac_id SMALLINT --基地ID
DECLARE @Msort_ID SMALLINT --物料类别ID
DECLARE @YearNO SMALLINT --年度
DECLARE @Folio VARCHAR(15) --最终生成的单据号
BEGIN
SELECT @ID=ID,@Fac_id=Fac_id,@Msort_ID=Msort_ID,@YearNO=YEAR(Date)
FROM Inserted
----------------------------------------------------------------------------
SELECT @Folio=REPLACE(STR(Fact_id,2)+STR(Msort_ID,2)+STR(YearNo,4)+
STR (value,5),' ','0')
FROM F_Arithmometer(TABLOCKX) --锁住该表
WHERE Fac_id=@Fac_id and Msort_id=@Msort_ID and YearNo=@YearNO
IF @@ROWCOUNT<>0 --没有生成单号,回滚事务
ROLLBACK TRANSACTION
RETURN
END
-----------------------------------------------------------------------------
BEGIN
UPDATE MINM SET Folio=@Folio
WHERE ID=@ID
IF @@ERROR<>0
ROLLBACK TRANSACTION
RETURN
END
-----------------------------------------------------------------------------
BEGIN
UPDATE F_Arithmometer SET VALUE=VALUE+1
WHERE fact_id=@Fac_id and
msort_id=@Msort_ID and YearNo=@YearNO
IF @@ERROR<>0
ROLLBACK TRANSACTION
RETURN
END
对不起,高手是有原则的,怎么能因为你多给分就破坏自己的原则呢?
在高手眼中,分数只是过眼云烟。
但考虑到我的云烟目前比较少,连过眼都不够,所以你要是答应给个20000分,我会考虑一次给你10个签名。
你的问题到底是什么呢,可以说下你的出错提示么???
他的问题是"有没有高手",现在的答案是:有,bluepower2008(蓝色力量) TO:bluepower2008(蓝色力量)
你好象数学没学好,亏本生意都做的??
我要是你,签一个名不累,3000够了,签10个名多累呀,至少每个4000!
bluepower2008(蓝色力量),去不去?到时一不小心你要我的签名了,那时非涨价不可!
to: Haiwer(海阔天空)
你还是很厉害嘛,我唯一的罩门都被你发现了。我打小就没学好数学,以前买鸡蛋就只知道5毛钱俩,至打老师告诉我签名要20000分10个后,我就一直用这个价格,你冷不丁给我一个3000分1个的价格,我把脚趾头都用上,也没算清楚哪个便宜,只好用老价钱,反正应该不会亏,老师说的嘛!:)至于春节联欢晚会这种小场面,我一般是不去的,但考虑到导演也不容易,如果他能给我20000分买我10个签名,我会考虑的。
DECLARE @Fac_id SMALLINT --基地ID
DECLARE @Msort_ID SMALLINT --物料类别ID
DECLARE @YearNO SMALLINT --年度
DECLARE @Folio VARCHAR(15) --最终生成的单据号SELECT @ID=ID,@Fac_id=Fac_id,@Msort_ID=Msort_ID,@YearNO=YEAR(Date)
FROM Inserted SELECT @Folio=REPLACE(STR(Fact_id,2)+STR(Msort_ID,2)+STR(YearNo,4)+
STR (value,5),' ','0') FROM F_Arithmometer(TABLOCKX)
WHERE fac_id=@Fac_id and msort_id=@Msort_ID and YearNo=@YearNO
IF @@ROWCOUNT=0 --没有生成单号,回滚事务
BEGIN
ROLLBACK TRANSACTION
RETURN
END UPDATE MINM SET Folio=@Folio WHERE ID=@ID
IF @@ERROR<>0
BEGIN
ROLLBACK TRANSACTION
RETURN
END UPDATE F_Arithmometer SET VALUE=VALUE+1 WHERE fact_id=@Fac_id and
msort_id=@Msort_ID and YearNo=@YearNO
IF @@ERROR<>0
BEGIN
ROLLBACK TRANSACTION
RETURN
END
上面的语句我认为没有问题
我想你的问题出在minm表里,设置一个自动加一的主键,或者你别的表的触发器涉及到了你这个触发器里的某个表.不知对不对
我后来发现,原来出错的原因不是这个引起,而是打印机出错提示‘已经有一个激活的事务’,操作员对我报告这个错误时,我神经过敏所致,因为我刚刚在数据库中加上了这个触发器。现经过多次测试,绝对没有问题,如有人认可此法可大胆使用。
另外,我还想请教,各位大侠在处理单号连续这个问题的时候是怎样做的,说出来交交流流也好。
To zhaohe(霹雳五号)
你说要使用 Tablockx锁住此表,我开始也是这么做的,后来有一次发现所有的用户都提示连接超时错,我花了两个小时的时间,发现就是因为锁住这个表出了问题,我也看过书上讲,事务提交或回流后将会自动解锁,可是它没有自动解锁,我只好去掉了这个锁,不知有没有什么方法能手动地在事务结束后解锁而不依赖系统。