《Mysql入門mysql事務實現并發安全的自增ID的方法》要點:
本文介紹了Mysql入門mysql事務實現并發安全的自增ID的方法,希望對您有用。如果有疑問,可以聯系我們。
導讀:本節內容:mysql中實現并發平安的自增ID在實際的項目中,經常會用到自增id,比如uid,最簡單的方法就是用直接用數據庫提供的AUTO_INCREMENT...
本節內容:
mysql中實現并發平安的自增IDMYSQL教程
在實際的項目中,經常會用到自增id,比如uid,最簡單的方法就是用直接用數據庫提供的AUTO_INCREMENT,但是如果用戶量非常大,幾千萬,幾億然后需要分表存儲時,這種方案就搞不定了,所以最好有一個全局的自增ID的生成器,不管是否分表,都能從生成器中獲取到全局自增的ID.MYSQL教程
需要解決的問題:保證mysql數據庫在高并發的情景下,數據獲取依然正確,每次獲取的ID都不會重復.MYSQL教程
這里分享兩種利用mysql的innodb的事務特性來實現的方案,一種是實現過了的,另一種沒有試驗過,不過應該也能走的通.MYSQL教程
首先,介紹第一種:在數據庫中單獨設置一張表,來存儲ID,表有兩個字段,一個是種類吧,一個就是ID:
?MYSQL教程
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;?
一個存儲過程:
?MYSQL教程
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;?
//?
重點看這句:
?MYSQL教程
select id into oldid from maibo_auto_id where idname=idname_in for update
?
會給相關數據加一個獨占鎖定,這時候別的進程如果來讀取該條記錄,就會進入等待,等待這個進程commit之后,再繼續,這樣就保證了在并發的情況下,不同的進程不會取到相同的值.MYSQL教程
如果前端是用php實現的.MYSQL教程
只需執行如下兩個sql,就可以獲取到,這個small參數是定義的是從多少開始自增:
?MYSQL教程
$sql = "call get_increment_id('{$key}', {$small}, @id)";
$ret = $db->getData("select @id");
下面介紹第二種方法,就是利用mysql的auto_increment.MYSQL教程
先創建一張表,表里邊只有一個自增字段:
?MYSQL教程
create table test(?
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'id',?
primary key (id)?
)ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;?
使用下面兩條sql:
?MYSQL教程
UPDATE test SET id = LAST_INSERT_ID(id + 1);?
SELECT LAST_INSERT_ID();?
?
也可以解決問題.MYSQL教程
LAST_INSERT_ID是不用查表的,而且只針對當前連接,也就是說別的連接的更新不會影響到當前連接的取值.MYSQL教程
這樣可能每個ID都得弄一張表來維護,這也是缺點.MYSQL教程
大家可以根據自己的需要,靈活選擇以上二種方法,在mysql中實現并發平安的自增ID.MYSQL教程
維易PHP培訓學院每天發布《Mysql入門mysql事務實現并發安全的自增ID的方法》等實戰技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養人才。
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/14324.html