15 个解决方案
#1
这个问题我也遇到,可不可以用select语句确定这条纪录~?
#2
新添加的记录的id是最大的,可以用select max(id) as maxid from table来获得
#3
用max()取了再程序监控max()不行吗,不过需要外部程序……
#4
不一定,这是一个并发程序,可能我访问的期间,别的线程也添加了记录,所以不一定最大。最好是先得到,或者添加的时候有返回值。
#5
那就在添加记录前,先用max(id)获得当前最大的id,然后添加记录,那么你添加的记录的id就是原最大ID值+1
#6
有道理。
#7
to:tommychim(大脚鸟)
错了你这样做也没有用,并发也不可以解决。
max(id)大家都用的时候,ID可能得到的是一样的。
你可以写个小程序测试一下。
错了你这样做也没有用,并发也不可以解决。
max(id)大家都用的时候,ID可能得到的是一样的。
你可以写个小程序测试一下。
#8
to:lynxliu
是否单号问题?看这一贴:
http://www.csdn.net/expert/topic/426/426165.shtm
是否单号问题?看这一贴:
http://www.csdn.net/expert/topic/426/426165.shtm
#9
@@Identity
#10
t我希望可以在程序里面解决
关键是ADO可不可以锁定数据表。“数据库”说的对,并发问题一定要保证操作的原子性。也就是我需要先锁定数据表,再操作,然后查询得到最大值,再释放锁。
我不知道在ADO里面怎么做,我是用delphi访问。我觉得单号问题把问题搞得复杂了,利用自动增的机制,可以保证不重复,关键还是锁定表。
谁能给出代码?
相比之下,我更喜欢Oracle的Seq,方便。
关键是ADO可不可以锁定数据表。“数据库”说的对,并发问题一定要保证操作的原子性。也就是我需要先锁定数据表,再操作,然后查询得到最大值,再释放锁。
我不知道在ADO里面怎么做,我是用delphi访问。我觉得单号问题把问题搞得复杂了,利用自动增的机制,可以保证不重复,关键还是锁定表。
谁能给出代码?
相比之下,我更喜欢Oracle的Seq,方便。
#11
采用readcommited事务模式
#12
添完了再查询也可以考虑
#13
Access中可以使用DAO的Recordset的AddNew, LastModified和Bookmark属性。
Function GetMaxNo() As Long
'Open db, rs objects...
'add one new record
rs.AddNew
'Set the new values for fields
rs.Update
Set rs.bookmark = rs.LastUpdated
GetMaxNo = rs.Fields("AutoNum").Value
'Close the rs and db objects
End Function
Function GetMaxNo() As Long
'Open db, rs objects...
'add one new record
rs.AddNew
'Set the new values for fields
rs.Update
Set rs.bookmark = rs.LastUpdated
GetMaxNo = rs.Fields("AutoNum").Value
'Close the rs and db objects
End Function
#14
一,在一个事务里用select max(id) from yourtable
二,新增后set yourID=@@Identity
二,新增后set yourID=@@Identity
#15
如果不用自动增加,因为在sql server中没有before insert 型的触发器,所以是办不到的
#1
这个问题我也遇到,可不可以用select语句确定这条纪录~?
#2
新添加的记录的id是最大的,可以用select max(id) as maxid from table来获得
#3
用max()取了再程序监控max()不行吗,不过需要外部程序……
#4
不一定,这是一个并发程序,可能我访问的期间,别的线程也添加了记录,所以不一定最大。最好是先得到,或者添加的时候有返回值。
#5
那就在添加记录前,先用max(id)获得当前最大的id,然后添加记录,那么你添加的记录的id就是原最大ID值+1
#6
有道理。
#7
to:tommychim(大脚鸟)
错了你这样做也没有用,并发也不可以解决。
max(id)大家都用的时候,ID可能得到的是一样的。
你可以写个小程序测试一下。
错了你这样做也没有用,并发也不可以解决。
max(id)大家都用的时候,ID可能得到的是一样的。
你可以写个小程序测试一下。
#8
to:lynxliu
是否单号问题?看这一贴:
http://www.csdn.net/expert/topic/426/426165.shtm
是否单号问题?看这一贴:
http://www.csdn.net/expert/topic/426/426165.shtm
#9
@@Identity
#10
t我希望可以在程序里面解决
关键是ADO可不可以锁定数据表。“数据库”说的对,并发问题一定要保证操作的原子性。也就是我需要先锁定数据表,再操作,然后查询得到最大值,再释放锁。
我不知道在ADO里面怎么做,我是用delphi访问。我觉得单号问题把问题搞得复杂了,利用自动增的机制,可以保证不重复,关键还是锁定表。
谁能给出代码?
相比之下,我更喜欢Oracle的Seq,方便。
关键是ADO可不可以锁定数据表。“数据库”说的对,并发问题一定要保证操作的原子性。也就是我需要先锁定数据表,再操作,然后查询得到最大值,再释放锁。
我不知道在ADO里面怎么做,我是用delphi访问。我觉得单号问题把问题搞得复杂了,利用自动增的机制,可以保证不重复,关键还是锁定表。
谁能给出代码?
相比之下,我更喜欢Oracle的Seq,方便。
#11
采用readcommited事务模式
#12
添完了再查询也可以考虑
#13
Access中可以使用DAO的Recordset的AddNew, LastModified和Bookmark属性。
Function GetMaxNo() As Long
'Open db, rs objects...
'add one new record
rs.AddNew
'Set the new values for fields
rs.Update
Set rs.bookmark = rs.LastUpdated
GetMaxNo = rs.Fields("AutoNum").Value
'Close the rs and db objects
End Function
Function GetMaxNo() As Long
'Open db, rs objects...
'add one new record
rs.AddNew
'Set the new values for fields
rs.Update
Set rs.bookmark = rs.LastUpdated
GetMaxNo = rs.Fields("AutoNum").Value
'Close the rs and db objects
End Function
#14
一,在一个事务里用select max(id) from yourtable
二,新增后set yourID=@@Identity
二,新增后set yourID=@@Identity
#15
如果不用自动增加,因为在sql server中没有before insert 型的触发器,所以是办不到的