以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.net/bbs/index.asp)
--  专家坐堂  (http://foxtable.net/bbs/list.asp?boardid=2)
----  代码逻辑救助  (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=83183)

--  作者:santde
--  发布时间: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
--  发布时间:2016/4/2 15:24:00
--  
方法一,使用事务http://www.foxtable.com/help/topics/2933.htm

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

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

推荐方法三

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

推荐方法三  

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

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

--  作者:Hyphen
--  发布时间:2016/4/5 8:42:00
--  
编码规则也是人定的,一样可以写到数据库作为配置项使用。何况再怎么变,顺序都是从一个固定的值开始,只是前缀或者后缀不一样。

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