sql表中获取最大流水号的问题
|
admin
2011年3月3日 16:54
本文热度 3892
|
我以前都是用以下的方法获得最大流水号,,以前一直以为不会有重复号,,,
n=SQLEXEC(con,"select MAX(idh) from ghk","mycur")
IF n < 1
MESSAGEBOX( "失败 !")
RETU
ENDIF
zd_idh=mycur.exp+1
n=SQLEXEC(con,"insert into ghk(idh) values (?zd_idh)")
IF n < 1
MESSAGEBOX( "失败 !")
RETU
ENDIF
但我今天看到了论坛上另外一个人发的有关这方面的帖子,,,所以我也对我的这段代码有疑虑了,,因为有可能同时二个人获得同样的最大号,,这该怎么办??
该文章在 2011/3/3 16:54:39 编辑过
| |
全部评论5 |
|
admin
2011年3月3日 16:54
能否建多一个表,用来存放最大的单号,当需要新单号的时候先到该表取得下一单号的数字,再作加1处理,这样即使上一个用户的单未完成,下一个用户访问该的时候取得的是另外一个单号了。 该评论在 2011/3/3 16:54:49 编辑过
|
|
admin
2011年3月3日 16:55
不是这样的问题,,我是读取后马下先把最大号写入表中的,并不是一个单全部处理完再写入,,主要是在读取计算最大号而没有写入表的瞬间有可能刚好同时有几个人在操作(虽然这种机率是很少很少),,就可能产生重复号了 该评论在 2011/3/3 16:55:02 编辑过
|
|
admin
2011年3月3日 16:55
启动事务,锁定SQL表在你写入时,其它用户不可读写该表。 该评论在 2011/3/3 16:55:29 编辑过
|
|
admin
2011年3月3日 16:55
=SQLSETPROP(nhandle,"Transactions" ,2)&&启动事务
csql="select MAX(spid) as maxid from sp with (serializable)" &&取最号,并锁其它用户读入
nResult=TABLEUPDATE(.T.,.T.,'cursp')&&提交
IF nResult=.t.&&成功
=SQLCOMMIT(nhandle)
=MESSAGEBOX("保存商品登记成功!",64,'提示')
ELSE
=SQLROLLBACK(nhandle)
=MESSAGEBOX("保存商品登记失败!",16,'提示')
ENDIF
=SQLSETPROP(nhandle,"Transactions" ,1)&&结束事务 该评论在 2011/3/3 16:55:46 编辑过
|
|
admin
2011年3月3日 16:56
一、编号的过程应该由服务器来完成。
二、编号的字段应该是主键。
三、编号都是由事务来完成的。
四、如果简单的单一表处理。直接编写成函数,然后在表的INSERT 触发器写入该函数;如果是涉及多表复杂处理,可以编写成存储过程,然后直接调用该存储过程,并传递相应的参数,处理全部由存储过程操作。 该评论在 2011/3/3 16:56:25 编辑过
|