一个2层管理系统,多人操作保存单据经常长生串号,重号情况。
系统是以前一个同事开发的。现在走人了,收拾烂摊子。
在生成ID的时候默认取最大值+1再保存,但是在实际多人同时操作中会出现2人取到同一个ID。
换成3层的话会自动队列解决吗?
可以的话转3层有什么方便快捷的方法。
或者还有别的解决办法没。事务什么的行不,事务行的话怎么锁他比较好
[解决办法]
id 设置是自增的 话就没这个情况了
[解决办法]
转3层的话操作反尔复杂了。
如果你的二层是单笔提交的话不怎么会出现这个问题。
若是多笔提交可以写到触发器中去,让触发器去设置.
[解决办法]
[解决办法]
1、 ID 建立唯一索引,出重就生常。常,重新取得新ID。
2、由器生成ID,就不有些麻。
3、碰撞的情在二或三中,均可能生,因多的系也需要支持,否系性能太低。
[解决办法]
保存的候重新取
[解决办法]
编号直接 GUID
[解决办法]
【取最大值+1再保存】的具体代码贴出来看看
如果是sql、存储过程,按理说是很难重号的
[解决办法]
把你的ID也设为主键,保存前,生成你的ID(最大值+1),保存时,捕获异常,是主键冲突时,重新生成你的ID,再保存
[解决办法]
[解决办法]
不是自动增长,而是在一个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只要记住一个当前有几人排队取用友的最大号。。。。。
[解决办法]
提交时再验证一次,(虽然这样也存在编号重复的几率,但会降低很多)
提交时捕获异常,如果重复,则提示用户重新点击保存,(再次验证并提交)。
[解决办法]