首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

一个2层管理系统,多人操作保存单据经常长生串号,重号情况。该如何解决

2012-05-09 
一个2层管理系统,多人操作保存单据经常长生串号,重号情况。系统是以前一个同事开发的。现在走人了,收拾烂摊

一个2层管理系统,多人操作保存单据经常长生串号,重号情况。
系统是以前一个同事开发的。现在走人了,收拾烂摊子。

在生成ID的时候默认取最大值+1再保存,但是在实际多人同时操作中会出现2人取到同一个ID。

换成3层的话会自动队列解决吗?
可以的话转3层有什么方便快捷的方法。


或者还有别的解决办法没。事务什么的行不,事务行的话怎么锁他比较好

[解决办法]
id 设置是自增的 话就没这个情况了

[解决办法]
转3层的话操作反尔复杂了。

如果你的二层是单笔提交的话不怎么会出现这个问题。

若是多笔提交可以写到触发器中去,让触发器去设置.
[解决办法]

探讨
id 设置是自增的 话就没这个情况了

[解决办法]
1、給 ID 建立唯一索引,這樣出現重複時就會產生異常。識別該異常,並重新取得新ID。
2、選擇由觸發器生成ID,這樣就不會有這些麻煩。
3、碰撞的情況無論在二層或三層中,均可能發生,因為多層的系統也需要支持並發,否則系統性能太低。
[解决办法]
保存的時候重新取號
[解决办法]
编号直接 GUID
[解决办法]
【取最大值+1再保存】的具体代码贴出来看看
如果是sql、存储过程,按理说是很难重号的
[解决办法]
把你的ID也设为主键,保存前,生成你的ID(最大值+1),保存时,捕获异常,是主键冲突时,重新生成你的ID,再保存

[解决办法]
探讨
是取最大值+1
一下午5,6个人可能操作几千次,会产生1-2次。
求个解决方案。。是取的用友凭证。方法好的我提供些辛苦费。。。

[解决办法]
不是自动增长,而是在一个sql(事务)里实现:取最大并加1
[解决办法]
如果是delphi实现:先执行取最大的sql,再delphi拿结果加1再执行sql去修改
期间的时间间隙是足够别的人也执行取最大了

如果是sql实现,2个sql一次性提交,则不存在时间间隙
[解决办法]
写一个存储过程
或直接发送一个多行sql

SQL code
declare @nid int;select @nid=newid from tb where item='凭证号';update tb set newid=newid+1 where item='凭证号';select @nid+1 as fret;--不知道具体取最大的做法,大致意思
[解决办法]
不能马上把那条记录的值先加1?

如果用友那个表的递增需要很复杂的工作(不能你的sql里能写的),才能完成,那就不能用这个方法了
[解决办法]
弱弱的说下,加个sleep?
[解决办法]
或者,换一个思路:既然用友自己会维护最大号
delphi只要记住一个当前有几人排队取用友的最大号。。。。。
[解决办法]
提交时再验证一次,(虽然这样也存在编号重复的几率,但会降低很多)
提交时捕获异常,如果重复,则提示用户重新点击保存,(再次验证并提交)。
[解决办法]
探讨
谢谢各位回复,不是自增的ID,是用友的凭证号,无发自增

热点排行