以文本方式查看主题 - 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),一样可以适用方法三
|