Foxtable(狐表)用户栏目专家坐堂 → 代码逻辑救助


  共有2046人关注过本帖树形打印复制链接

主题:代码逻辑救助

帅哥哟,离线,有人找我吗?
santde
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:274 积分:2293 威望:0 精华:0 注册:2015/6/14 18:33:00
代码逻辑救助  发帖心情 Post By:2016/4/2 14:23:00 [只看该作者]

cmd1.ConnectionName = gs_strActiveConn '设置数据源名称
cmd2.ConnectionName = gs_strActiveConn
cmd1.commandText = "Sel ect Count(*) From [Xtnumber] Where [StartStr] = '" & pf & "' And TableName = '" & nm & "'"
If cmd1.ExecuteScalar = 0 Then '如果编号表不存在前缀的行,那么增加一行
    cmd1.commandtext = "Insert Into Xtnumber (TableName, StartStr, ID) Values('" & nm & "','" & pf & "',0)"
    cmd1.ExecuteNonQuery
End If
cmd1.commandText = "Sel ect [ID] From [Xtnumber] Where [StartStr] = '" & pf & "' And TableName = '" & nm & "'"
Do
    Key = cmd1.ExecuteScalar() '从后台获得顺序号
    cmd2.commandText = "Up date [Xtnumber] Set [ID] = " & (Key + 1) & " Where [ID] = " & Key & " And [StartStr] = '" & pf & "' And TableName= '" & nm & "'"
    If cmd2.ExecuteNonQuery() > 0 Then '更新顺序号
        Exit Do '更新成功则退出循环
    End If
Loop

这代码用于 网络 环境编号自动生成确保唯一

如果数据记录已有的时候,在原始基础上增加编号 没问题

但是如果没有数据写入第一行值的时候,可能存在风险,比如开始读取数据的时候是没有的,但是在写入数据的时候,如果被别人抢先写入了,有可能发生插入重复数据。 如何确保插入数据前对是否有数据进行校验,已插入就执行后面的代码,没有插入才插入值。

 回到顶部
帅哥哟,离线,有人找我吗?
Hyphen
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:5015 积分:25363 威望:0 精华:0 注册:2015/8/18 9:21:00
  发帖心情 Post By:2016/4/2 15:24:00 [只看该作者]

方法一,使用事务http://www.foxtable.com/help/topics/2933.htm

方法二,把获取编号的几个sql写到一个存储过程中,使用表级锁

方法三,事先在编号表增加业务表的编号记录,编号默认从1开始,然后可以使用事务的方式,先update编号+1,再取值。在事务没有完成之前会产生行级锁,其它人是update不了的,不会出现并发争用问题

推荐方法三

 回到顶部
帅哥哟,离线,有人找我吗?
santde
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:274 积分:2293 威望:0 精华:0 注册:2015/6/14 18:33:00
  发帖心情 Post By:2016/4/2 19:02:00 [只看该作者]

方法三,事先在编号表增加业务表的编号记录,编号默认从1开始,然后可以使用事务的方式,先update编号+1,再取值。在事务没有完成之前会产生行级锁,其它人是update不了的,不会出现并发争用问题

推荐方法三  

方法三在部份情况下是无法使用的

因为有些编码规则是实时产生的,无法预先判定

 回到顶部
帅哥哟,离线,有人找我吗?
Hyphen
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:5015 积分:25363 威望:0 精华:0 注册:2015/8/18 9:21:00
  发帖心情 Post By:2016/4/5 8:42:00 [只看该作者]

编码规则也是人定的,一样可以写到数据库作为配置项使用。何况再怎么变,顺序都是从一个固定的值开始,只是前缀或者后缀不一样。

极端的情况下就算顺序的开始值不是固定的,一样可以给任意一个初始值(比如-1),一样可以适用方法三

 回到顶部