特点:
封装,复用
可以接收参数,也可以返回数据
减少网络交互,效率提升
存储过程
创建
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隔离级别下支持
- 行锁(Record Lock):锁定单个行记录的锁,防止其它事务对此进行update和delete。在RC、RR隔离级别下都支持。
语法:加锁:lock tables 表名… read/write
释放锁:unlock tables / 客户端断开连接