應用mysql事務特征完成並發平安的自增ID示例。本站提示廣大學習愛好者:(應用mysql事務特征完成並發平安的自增ID示例)文章只能為提供參考,不一定能成為您想要的結果。以下是應用mysql事務特征完成並發平安的自增ID示例正文
項目中常常會用到自增id,好比uid,最簡略的辦法就是用直接用數據庫供給的AUTO_INCREMENT,然則假如用戶量異常年夜,幾萬萬,幾億然後須要分表存儲的時刻呢,這類計劃就弄不定了,所以最好有一個全局的自增ID的生成器,不論能否分表,都能從生成器中獲得到全局自增的ID。
完成辦法應當有許多,不外一切的計劃都須要處理一個成績,就是包管在高並發的情形下,數據獲得仍然准確,每次獲得的ID都不會反復。
這裡我分享兩種應用mysql的innodb的事務特征來完成的計劃,一種是完成過了的,另外一種沒有實驗過,不外應當也能走的通。
先引見第一種,在數據庫中零丁設置一張表,來存儲ID,表有兩個字段,一個是品種吧,一個就是ID:
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以後,再持續,如許就包管了在並發的情形下,分歧的過程不會取到雷同的值。
假如你的前端是用php完成的。
只需履行以下兩個sql,便可以獲得到,這個small參數是界說的是從若干開端自增
$sql = "call get_increment_id('{$key}', {$small}, @id)";
$ret = $db->getData("select @id");
還有別的一種辦法,就是應用mysql的auto_increment。
先創立一張表,內外邊只要一個自增字段:
create table test(
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',
primary key (id)
)ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
經由過程以下兩條sql:
UPDATE test SET id = LAST_INSERT_ID(id + 1);
SELECT LAST_INSERT_ID();
也能處理成績, LAST_INSERT_ID是不消查表的,並且只針對以後銜接,也就是說其余銜接的更新不會影響到以後銜接的取值。
如許能夠每一個ID都得弄一張表來保護,這也是缺陷。
詳細應用中若何處置,就看本身的選擇了。