Mysql存储过程

本文介绍了MySQL中的存储过程,包括创建、调用和删除,以及变量的使用,如系统变量和用户自定义变量。此外,还详细讨论了不同级别的锁,如全局锁、表级锁和行级锁,以及它们在数据库并发控制中的作用,旨在提高数据库操作的效率和数据一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

特点:

封装,复用

可以接收参数,也可以返回数据

减少网络交互,效率提升

存储过程

创建

create procedure name() begin ... end;

调用

call name();

查看

select * from INFORMATION_SCHEMA.ROUTINES where ROUTINE_SCHEMA='datebase';
show create PROCEDURE 存储过程名称(name);

删除

drop procedure if exists name

变量

系统变量是MySQL服务器提,不是用户定义的,属于服务器层面,分为全局变量(GLOBAL)、会话变量(SESSION)。

查看系统变量

show [global|session] variables;
show [global|session] variables like '...';
select @@[global|session].autocommit;

设置系统变量

set [session|global] autocommit = 0;

用户自定义变量

用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用“@变量名”使用就可以。其作用域为当前连接

局部变量

根据需要定义的在局部生效的变量,访问之前需要declare声明。可用作存储过程内的局部变量和输入参数,局部变量的范围是在其内声明的begin…end

declare 变量名 变量类型[default …];

变量类型就是数据库字段类型:int、bigint、char、varchar、date、time等;

赋值

set 变量名 = 值
set 变量名:=值
select 字段名 into 变量名 f rom 表名...;

全局锁

对整个数据库实例加锁,加锁后整个实例就处于只读状态,后续的DML语句,DDL语句,已经更新操作的事务提交语句都将被阻塞。

表级锁

每次操作锁住整张表,锁粒度大,发生锁冲突的概率最高,并发度最低。应用在MyISAM、InnoDB、BDB等存储引擎中

  • 表锁

    • 表共享锁(read lock)
    • 表独占锁(write lock)
  • 元数据锁(meta data lock,MDL)

    MDL加锁过程是系统自动控制,无需显式使用,在访问一张表的时候会自动加上。MDL锁主要作用是维护表元数据的数据一致性,在表上有活动事务的时候,不可以对元数据进行写入操作,避免DML与DDL冲突

  • 意向锁

    • 意向共享锁(IS):与表锁共享锁(read)兼容,与表锁排他锁(write)互斥
    • 意向排他锁(IX):与表锁共享锁(read)及排他锁(write)都互斥。意向锁之间不会互斥
  • 行级锁

    每次操作锁住对应的行数据。锁粒度最小,发生锁冲突的概率最低,并发度最高。应用在InnoDB存储引擎中。

    • 行锁(Record Lock):锁定单个行记录的锁,防止其它事务对此进行update和delete。在RC、RR隔离级别下都支持。
      • 共享锁(S):允许一个事务去读一行,阻止其它事务获取相同的数据集的排他锁。
      • 排他锁(X):允许获取排他锁的事务更新数据,阻止其它事务获取相同数据集的共享锁和排他锁。
    • 间隙锁(Gap Lock):锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其它事务在这个间隙进行insert,产生幻读。在隔离级别下都支持。
    • 临键锁(Next-Key Lock):行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在RR隔离级别下支持

语法:加锁:lock tables 表名… read/write

释放锁:unlock tables / 客户端断开连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Array_new

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值