MYSQL 函式呼叫導致自動生成共享鎖問題

2021-09-02 13:00:09 字數 2629 閱讀 5948

mysql版本:5.6.27

[color=red][b]導致問題出現的mysql配置:my.ini中配置了log-bin=mysql-bin[/b][/color]

問題重現配置:

表:

create table `t_oss_uniqueid` (

`name` varchar(50) not null default '' comment '表名(大寫)',

`current_value` bigint(11) default null comment 'value',

`prefix` bigint(11) default null comment '字首',

primary key (`name`)

) engine=innodb default charset=utf8 comment='id資源表';

函式:#簡稱fun1 –只作為描述語

create function `f_oss_getuniqueid`( seq_name varchar(50),seq_step int(11)) returns varchar(50) charset utf8

deterministic

begin

declare the_prefix integer;

select prefix into the_prefix from t_oss_uniqueid where name = seq_name;

return

concat(the_prefix,date_format(sysdate(),"%y%m%d"),lpad(f_oss_nextuniqueid(seq_name,seq_step),8,0));

end;

#簡稱fun2 –只作為描述語

create function `f_oss_nextuniqueid`(seq_name varchar(50), seq_step int(11)) returns int(11)

deterministic

begin

declare the_value integer;

set the_value = 0;

update t_oss_uniqueid set current_value = current_value + seq_step where name = seq_name;

select current_value into the_value from t_oss_uniqueid where name = seq_name;

if the_value<100000000 then

return the_value;

else

update t_oss_uniqueid set current_value=1 where name = seq_name;

return 1;

end if;

end;

場景簡介:

前提:mysql配置log-bin=mysql-bin;

場景1:

[list]

[*]1. 不修改fun1與fun2。

[*]2. 呼叫fun1函式。

[*]3. fun1函式內部的select語句會出現自動加上s鎖。

[*]4. fun2函式內部update自動獲取x鎖。

[*]5. 多執行緒併發,會導致死鎖。

[*][/list]

場景2:

[list]

[*]1. 修改fun1,select語句加上for update。fun2 不修改。

[*]2. 呼叫fun1函式。

[*]3. fun1函式內部的select語句會出現自動獲取x鎖

[*]4. fun2函式內部update自動獲取x鎖。

[*]5. 多執行緒併發,不會出現死鎖。

[/list]

場景3:

[list]

[*]1. 修改fun1,fun2。合併成乙個函式為fun1。

[*]2. 呼叫fun1函式。

[*]3. fun1函式內部只會出現x鎖,無s鎖出現。

[*]4. 多執行緒併發,不會出現死鎖。

[/list]

場景4:

[list]

[*]1. 不修改fun1。修改fun2,注釋掉第乙個update語句。

[*]2. 呼叫fun1函式。

[*]3. fun1函式內部的select語句會自動加上s鎖。

[*]4. fun2函式內部不會出現x鎖。

[*]5. 多執行緒併發,不會出現死鎖,但是功能已經不完整。

[/list]

場景5:

[list]

[*]1. 不修改fun1。修改fun2,注釋掉兩個update語句。

[*]2. 呼叫fun1函式。

[*]3. fun1函式內部無鎖。

[*]4. fun2函式內部無鎖。

[*]5. 多執行緒併發,不會出現死鎖,但是功能已經不完整。

[/list]

mysql 過程呼叫函式 mysql函式呼叫過程

1.conn mysql init null 初始化 mysql conn 2.mysql real connect conn,localhost root 123456 xpy 0,null,client found rows 失敗 null 建立乙個連線 3.res mysql query co...

mySQL 自動生成編號

create table table 1 id int unsigned not null primary keyauto increment,id列為無符號整型,該列值不可以為空,並不可以重複,而且自增。name varchar 5 not null auto increment 100 id列從...

mysql 函式呼叫 mysql函式呼叫過程

1.conn mysql init null 初始化 mysql conn 2.mysql real connect conn,localhost root 123456 xpy 0,null,client found rows 失敗 null 建立乙個連線 3.res mysql query co...