以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  [求助]如何解决在多用户情况下自动编号重复问题?  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=139717)

--  作者:新福星
--  发布时间:2019/8/20 6:47:00
--  [求助]如何解决在多用户情况下自动编号重复问题?

多用户。设定了一个子程序获取编号。格式为日期+四位顺序号。

实现方法和帮助中的《自动编号生成方法》基本一样,只是将统计数量作为序号改为了表格记存方式。某个用户取一个加一。

并且设定了占用标识。

在实际使用中发现仍然会出现重号的现象。分析原因就是出现了极端情况,两个用户就是在同一时间进入子程序来获取编号。

这样取得的编号就重复了。

有什么办法解决么?程序如下。谢谢


图片点击可在新窗口打开查看此主题相关图片如下:qq图片20190820065002.png
图片点击可在新窗口打开查看
[此贴子已经被作者于2019/8/20 6:55:50编辑过]

--  作者:xxfoxtable
--  发布时间:2019/8/20 7:30:00
--  
常用的功能,官方能做出一个标准模块就好了
--  作者:有点蓝
--  发布时间:2019/8/20 8:43:00
--  
加入事务控制:http://www.foxtable.com/webhelp/topics/2933.htm
--  作者:新福星
--  发布时间:2019/8/20 9:27:00
--  

程序中所有的SQL语句都是单一单表执行语句,而不是多表多功能的语句.

不知道事务语句加到何处呢?谢谢


--  作者:有点蓝
--  发布时间:2019/8/20 9:35:00
--  
第一句SQL之前和最后一句SQL之后,而且需要改代码,使用同一个cmd变量

Try
    Connections("数据源").BeginTransaction() 
\'开始事务
    Dim cmd As new 
SQLCommand
    cmd.ConnectionName = 
"数据源"
    cmd.CommandText = 
"Delete From {订单} Where [订单编号] = 32"
    cmd.
ExecuteNonQuery
    cmd.CommandText = 
"Delete From {订单明细} Where [订单编号] = 32"
    cmd.
ExecuteNonQuery
    Connections("数据源").Commit 
\'提交事务,所有操作生效

Catch
 ex As Exception \'如果出错 
    Connections("数据源").Rollback() 
\'回滚事务,撤销所有操作

End
 Try

--  作者:新福星
--  发布时间:2019/8/20 9:40:00
--  

理解这个语句是保证订单和订单明细主从记录必须同时删除.要么就都不删除.

这个机到运用到保证取的编号唯一性的原理是什么呢?

可以理解为运用了事物机制后,是不是第二个进入者就无法修改数据了?自动排队了?谢谢


--  作者:有点蓝
--  发布时间:2019/8/20 10:01:00
--  
是的,因为有update,在事务没有结束之前,其他人就无法update同一行了
--  作者:playmal
--  发布时间:2020/8/24 11:41:00
--  
没看明白,有没有例子代码