CREATE TABLE auto_id( idname varchar(20) NOT NULL DEFAULT '', id bigint(20) NOT NULL DEFAULT 0 COMMENT '', primary key(idname) )ENGINE=Innodb DEFAULT CHARSET=utf8;
接下來是一個存儲過程:
復制代碼 代碼如下:
delimiter // drop procedure if exists get_increment_id; create procedure get_increment_id(in idname_in varchar(20), in small_in bigint, out id_out bigint) begin declare oldid bigint; start transaction; select id into oldid from maibo_auto_id where idname=idname_in for update; if oldid is NULL then insert into maibo_auto_id(idname,id) value(idname_in, small_in); set id_out=small_in; else update maibo_auto_id set id=id+1 where idname=idname_in; set id_out=oldid+1; end if; commit; end; //
重點是這句,select id into oldid from maibo_auto_id where idname=idname_in for update,會給相關數據加一個獨占鎖定,這時候別的進程如果來讀取該條記錄,就會進入等待,等待這個進程commit之后,再繼續,這樣就保證了在并發的情況下,不同的進程不會取到相同的值。