数据冲突,如何解决?

时间:2022-02-06 21:41:48
订单号,下订单时取表内最大的订单号然后加1,由于好多人同时下订单,经常产生重复的订单号,应该怎么办呀,老大们?

14 个解决方案

#1


把取定单的查询操作放到事务里去,这样就不会出现取重号的问题

#2


事务

#3


在更新表時,必須有鎖表動作
lock

#4


關注

#5


--测试一下,在一查询分析器里输入:
begin tran
declare @str int
select @str=max(id) from .....
insert into sdfsdf (...) values (...)
commit tran
---然后在另几个查询分析器(或不同机器)里输入如上代码,运行出结果就知道了

#6


例: if lock(talbe) then
       msgbox("資料表被鎖,請稍後再試.")
    else
       update table .....
    endif

#7


如果在程序里,也可以,比如asp
cn.begintransaction
rs.open "select max(id) from ..."......
.......
if err<>0 then
cn.rollback
else
cn.commite
end if

#8


同意楼上

#9


掉了一個not.
if lock(talbe) then
       msgbox("資料表被鎖,請稍後再試.")
    else
       update table .....
    endif

#10


应该用事务来处理并发操作,因为一个事务必须完成才能进行其它事务,这就保证了在事务时间取单号内不会存在相同的问题,但不提倡用锁表来防止并发操作,这样会大幅降低效率.
begin tran
declare @str int
select @str=max(id) from .....
insert into sdfsdf (...) values (...)
commit tran

#11


赞同楼上。

#12


不过,真正做大系统时,单据号决不应该是“流水号”这么简单。单据号上应该反映一些业务信息。

#13


我把数据库技术基础知识分为5大类:SQL、索引、查询规划、事务处理、分布式处理。每一个部分,都非常复杂。

#14


把这个字段设成关键字,试着向数据库里写你找到的最大ID,出错最找一次,再写!
如Delphi
Pass:=False;
while not Pass then
Try
  insert into .... values (maxID....)
  Pass:=True;
 except 
  maxId:=maxId + 1;
end 

#1


把取定单的查询操作放到事务里去,这样就不会出现取重号的问题

#2


事务

#3


在更新表時,必須有鎖表動作
lock

#4


關注

#5


--测试一下,在一查询分析器里输入:
begin tran
declare @str int
select @str=max(id) from .....
insert into sdfsdf (...) values (...)
commit tran
---然后在另几个查询分析器(或不同机器)里输入如上代码,运行出结果就知道了

#6


例: if lock(talbe) then
       msgbox("資料表被鎖,請稍後再試.")
    else
       update table .....
    endif

#7


如果在程序里,也可以,比如asp
cn.begintransaction
rs.open "select max(id) from ..."......
.......
if err<>0 then
cn.rollback
else
cn.commite
end if

#8


同意楼上

#9


掉了一個not.
if lock(talbe) then
       msgbox("資料表被鎖,請稍後再試.")
    else
       update table .....
    endif

#10


应该用事务来处理并发操作,因为一个事务必须完成才能进行其它事务,这就保证了在事务时间取单号内不会存在相同的问题,但不提倡用锁表来防止并发操作,这样会大幅降低效率.
begin tran
declare @str int
select @str=max(id) from .....
insert into sdfsdf (...) values (...)
commit tran

#11


赞同楼上。

#12


不过,真正做大系统时,单据号决不应该是“流水号”这么简单。单据号上应该反映一些业务信息。

#13


我把数据库技术基础知识分为5大类:SQL、索引、查询规划、事务处理、分布式处理。每一个部分,都非常复杂。

#14


把这个字段设成关键字,试着向数据库里写你找到的最大ID,出错最找一次,再写!
如Delphi
Pass:=False;
while not Pass then
Try
  insert into .... values (maxID....)
  Pass:=True;
 except 
  maxId:=maxId + 1;
end