MySQL併發獲取自增值的測試及處理

2021-10-05 16:48:42 字數 2199 閱讀 7799

最終解決指令碼

資料庫需要使用自定義的自增值。

用guid浪費資源,大家測試一下取10000條記錄時,返回guid與使用資料庫10000的自增值比較就懂了,這個場景多出現在匯入excel或其他情況,使用自增值時,可以一次性生成乙個數值段,避免了重複生成。

使用mysql自增字段會導致在資料庫中最後插入數值的id大於規劃的id時,無法從規劃的id進行自增,這個對分布式多資料庫影響很大。

使用mysql提供鎖,如下所示:

select * from auto_id for update;
首先,讓我們建乙個表

create table `auto_id` (

`idname` varchar(30) not null default '',

`id` bigint(20) not null default '0',

primary key (`idname`)

)collate='utf8_general_ci'

engine=innodb

;;

插入一條記錄

insert into auto_id (idname, id) values('abc', 0);
開啟兩個工具分別執行:

select * from auto_id for update;

update auto_id set id = id + 1 where idname = 'abc';

select * from auto_id;

這個測試的兩個客戶端都自增了,並不能說明自增是正確的,這是為什麼呢?原因很簡單,這是因為:mysql的預設級別是:repeatable-read,意思是說只要update就會馬上提交,因此無法測試我們的結果,因此我們應該把測試指令碼修改為:

start transaction;

select * from auto_id for update;

update auto_id set id = id + 1 where idname = 'abc';

select * from auto_id;

原理很簡單,先對其進行鎖處理,然後再進行update,在select中使用for update,這時會發現測試視窗a中的記錄執行成功了,測試視窗b的指令碼,執行到 select * from auto_id for update; 就執行不下去了,這說明鎖起了作用,當併發產生時,未能進入鎖操作的事務被掛起了。這時,只需要在視窗a中執行commit,視窗b的指令碼就可以執行下去了。

使用事務與for update語句來處理mysql的併發問題是可行的

create procedure `p_sys_get_increment_id`(

in `idname_in` varchar(20),

in `count_in` bigint,

out `id_out` bigint

)language sql

not deterministic

contains sql

sql security definer

comment '取自增id'

begin

declare oldid bigint;

start transaction;

select id into oldid from auto_id where idname=idname_in for update;

if oldid is null then

insert into auto_id(idname, id) value(idname_in, count_in + 1);

set id_out = 1;

else

update auto_id set id = id + count_in where idname = idname_in;

set id_out = oldid;

end if;

commit;

end

call p_sys_get_increment_id('abc', 10000, @key);

select @key;

結果非常快,達到之前設定的目標

MySQL獲取自增序列

因為業務要求,需要在mysql資料庫中,獲取下乙個自增主鍵的值。原先採用的方法是 select auto increment from information schema.tables where table schema 資料庫名稱 and table name 表名稱 limit 1但是這樣寫...

mysql獲取自動生成的id

自增主鍵 insert into user name,password value select last insert id insert into user name,password value select last insert id 得到剛 insert 進去記錄的主鍵值,只適用與自增主...

mysql 併發測試

針對上一節做一些針對公司業務的測試。我們來做一些壓力測試。伺服器配置 作業系統 centos 5.6 64 cpu 8核 記憶體 8g 硬碟 sas 檔案系統 linux mysql 5.6.網絡卡 100m 網路環境 良好 資料庫表 c account customer,這裡用來根據id查詢 更新...