最近几天十分郁闷,源于工作中出现问题,却找不到原因。
某部门代发工资,四千多条记录有一千多条在交易流水中发现记了两次账,而且记账时间基本在同一时间,有的也只相差一秒。
代发工资的存储过程采用游标轮询,游标中可确定没有因工作人员失误导致同一账户存在两条记录。也可确保程序中已提交成功的记录,在再次提交时不致再次记账。而且即使是程序问题多次提交导致重复记账,其记账时间也应相差较大。记账时间是取的系统时间。怀疑是数据库系统出了问题,但查找数据库日志,也没发现异常。领导十分重视,一天催着给出合理答复,可又实在不知是什么原因,痛苦啊。附游标部分如下:
declare curs cursor for
select a,b,c from a1
where ... order by a for read only
open curs
fetch curs into @a,@b,@c
while (@@sqlstatus <>2)
begin
begin tran
if @@sqlstatus = 1 goto errorlab
对@a,@b,@c进行处理并插入另一表tab中
commit tran
goto nextlab
errorlab:
while @@transcount>0 rollback
nextlab:
fetch curs into @a,@b,@c
end
close curs
deallocate cursor curs
执行此存储过程中游标后,游标中部分记录被重复执行了两次,在表tab中除交易流水号不同外,@a,@b,@c有两条记录
某部门代发工资,四千多条记录有一千多条在交易流水中发现记了两次账,而且记账时间基本在同一时间,有的也只相差一秒。
代发工资的存储过程采用游标轮询,游标中可确定没有因工作人员失误导致同一账户存在两条记录。也可确保程序中已提交成功的记录,在再次提交时不致再次记账。而且即使是程序问题多次提交导致重复记账,其记账时间也应相差较大。记账时间是取的系统时间。怀疑是数据库系统出了问题,但查找数据库日志,也没发现异常。领导十分重视,一天催着给出合理答复,可又实在不知是什么原因,痛苦啊。附游标部分如下:
declare curs cursor for
select a,b,c from a1
where ... order by a for read only
open curs
fetch curs into @a,@b,@c
while (@@sqlstatus <>2)
begin
begin tran
if @@sqlstatus = 1 goto errorlab
对@a,@b,@c进行处理并插入另一表tab中
commit tran
goto nextlab
errorlab:
while @@transcount>0 rollback
nextlab:
fetch curs into @a,@b,@c
end
close curs
deallocate cursor curs
执行此存储过程中游标后,游标中部分记录被重复执行了两次,在表tab中除交易流水号不同外,@a,@b,@c有两条记录
一部门代发工资时出现一千多条记录重复记账的问题,记账时间几乎一致。通过检查存储过程及数据库日志均未找到原因。现求助于社区共同探讨可能的原因。
1237

被折叠的 条评论
为什么被折叠?



