通過儲存過程解決並發生成唯一訂單號

2022-02-08 09:56:24 字數 3584 閱讀 4399

delimiter $$

use`roamerbuddy`$$

drop

procedure

ifexists

`generate_orderno`$$

create definer=`root`@`%` procedure

`generate_orderno`(

in ordernamepre char(4

),

in num int

, out neworderno

varchar (25))

begin

--訂單變化的值

declare ordernamevalue int;

--更新行數

declare updaterow int;

--當前日期,有可能包含時分秒

declare currenttime datetime;

--訂單號

declare ordercode varchar (64

) ;

--異常處理

declare

continue handler for

1062

set currenttime =

now() ;

select

ifnull(gs.ordervalue,

0) into

ordernamevalue

from

generate_serialno gs

where id =1;

set currenttime =

now() ;

--開啟自動提交

set autocommit =1;

iftrue

then

insert

into

generate_serialno (id, ordervalue, ordertime)

values

(1, 1

, currenttime) ;

endif;

update

generate_serialno obj

setobj.ordervalue

=case

when to_days(currenttime) >

to_days(obj.ordertime)

then

1else ordernamevalue +

1end

, obj.ordertime

=currenttime

where

( obj.id =1

and obj.ordervalue =

ordernamevalue

) ;set updaterow =

row_count() ;

while

! updaterow

=1 do --

獲得當前的訂單和變化的值

select

ifnull(gs.ordervalue,

0) into

ordernamevalue

from

generate_serialno gs

where id =1;

update

generate_serialno obj

setobj.ordervalue

=case

when to_days(currenttime) >

to_days(obj.ordertime)

then

1else ordernamevalue +

1end

, obj.ordertime

=currenttime

where

( obj.id =1

and obj.ordervalue =

ordernamevalue

) ;set updaterow =

row_count() ;

endwhile;

if num =

8then

--根據年月日生成訂單編號,訂單編號形式:字首+年月日+流水號,如:sh2013011000002

select

concat(

ordernamepre,

date_format(currenttime,

'%y%m%d'),

lpad(ordernamevalue, num, '0

'))

into

ordercode ;

elseif num =14

then

--根據年月日時分秒生成訂單編號,訂單編號形式:字首+年月日時分秒+流水號,如:sh2013011010050700001,個人不推薦使用這種方法生成流水號

select

concat(

ordernamepre,

date_format(currenttime,

'%y%m%d%h%i%s'),

lpad(ordernamevalue, num, '0

'))

into

ordercode ;

else

--根據年月日時分生成訂單編號,訂單形式:字首+年月日時分+流水號,如:sh20130110100900005

select

concat(

ordernamepre,

date_format(currenttime,

'%y%m%d%h%i'),

lpad(ordernamevalue, num, '0

'))

into

ordercode ;

endif;

select

ordercode ;

end$$

delimiter ;

drop

table

ifexists

`generate_serialno`;

create

table

`generate_serialno` (

`id`

int(20) default

null

, `orderno`

varchar(50) default

null

, `orderpre`

varchar(30) default

null

, `ordervalue`

int(20) default

null

, `ordertime`

datetime

default

null

) engine

=innodb default charset=

utf8;

insert

into `generate_serialno` (`id`, `ordervalue`) values('

1','

1');

高並發生成唯一訂單號

最近開發一套會員系統,涉及到訂單號生成,在高並發條前提下,如何生成唯一的訂單號值得斟酌,我這裡提供一種較為可行的方案 public static string getorderidbyuuid 0 代表前面補充0 4 代表長度為4 d 代表引數為正數型 return time string.form...

SQL server高並發生成唯一訂單號的方法實現

前幾天寫了一篇mysql高並發生成唯一訂單號的方法,有人私信問有沒有sql server版本的,今天中午特地寫了sql server版本的高並發生成唯一訂單號實現,其實mysql和sql server原理都一樣,主要是他們部分語法有些區別,所以你會發現我這篇文章文字說明幾乎一樣,只有 和介面不一樣。...

MySQL高並發生成唯一訂單號的方法實現

這篇博文發布後,有朋友問有沒有sql server版本的,現在有了 傳送門 在乙個erp進銷存系統或0a等其他系統中,如果多人同時進行生成訂單號的操作的話,容易出現多人獲得同乙個訂單號的情況,對公司業務造成不可挽回的損失 我們可以利用儲存過程和資料表搭配,建立一張表和建立儲存過程,儲存過程負責生成訂...