MYSQL笔记 之 事务

事务(Transaction)是并发控制的基本单位。所谓的事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。
命令如下
begin;/开启事务/
commit;/提交事务/
rollback;/回滚当前事务 (取消操作)/

savepoint 保存点名;/*事务中创建一个保存点*/
commit|rollback to savepoint 保存点名;/*执行*/

事务的四大特性(ACID)

  • 原子性 (Atomicity)

    一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
    同一事务中 要么全部成,要么全部失败

  • 一致性(Consistency)

    一致性是指事务使得系统从一个一致的状态转换到另一个一致状态。
    一个查询发起后,不管数据发生了多少变化 多少事务,查询结果应当为发起查询时间一致的数据

  • 隔离性(Isolation)

    数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

  • 持久性(Durability)

    事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

一、存储过程

存储过程

简单的说,它就是一组SQL语句的集合,功能强大,可以实现一些比较复杂的逻辑功能,类似于Java中的方法。

特性

有输入输出参数,可以声明变量,还有if/else,calse,while等控制语句
函数的基本特性:

  1. 模块化
  2. 封装
  3. 代码复用。

优点

1.将重复性很高的操作,封装到一个存储过程中,简化了SQL的调用
2.可利用存储过程批量处理数据
3.统一接口,确保数据安全
4.运行速度比较快。

缺点

1.增加SQL的代码维护性
2.移植比较困难
3.不方便调试

参数

  1. IN输入参数:表示调用者向存储过程传入值(可以是常量值也可以是一个变量)
  2. OUT输出参数:表示存储过程向调用者传出值(传出的值必须是变量)
  3. INOUT输入输出参数: (不建议使用)

代码

变量的定义

1. 定义存储过程
delimiter $$    /*临时修改语句结束符号为 $$*/
create procedure test_in (in temp_in integer)   /*创建新的存储过程*/
begin   /*开始本次函数*/
	select * from emp e where e.Empno = temp_in;   /*语句体*/
end $$  /*结束本次函数*/
delimiter ;    /*将结束符号改回  最后必须及时改回*/
2. 删除
drop procedure if exists test_in;/*删除已有的存储过程*/
3. 调用
call test_in(7844);

4. 判断语句

if 变量 = 1  /*判断条件*/
    then 语句体;
elseif 变量 = 0
    then 语句体;
else 
    语句体;
end if;     /*结束if*/

5. 循环语句

declare 变量名 数据类型;/*定义一个参数*/
set 变量名 = 0;
while 变量名 < 10 do
    set s=s+1;
end while;

6. 选择语句

case 参数
    when 值 then 代码块
    when 值 then 代码块
    else 代码块
end case;

7. LEAVE

  • 作用:跳出指定区域(结合LOOP来使用)
  • leave_name:区域起始地方
  • end 区域结束地方
  • 用于立即结束循环体,没有任何条件。LEAVE类似于java中的break

例题:

跳出while循环
delimiter $$
CREATE PROCEDURE pro5 (in num int)
BEGIN
	DECLARE i int;
	DECLARE temp int;
	set i = 0;
	set temp = 0;
	xx:LOOP
		WHILE i < num DO
			set i = i + 1;
			if i % 3 = 0 and i % 4 = 0 THEN
				SELECT i;
				set temp  = 1;
			END IF;
			if temp = 1 THEN
				LEAVE xx;
			END IF; 
		end while;
	END LOOP;
select i;
END $$
delimiter ;

8. loop

循环体,会一直循环,直到遇到退出条件,结合 leave 使用,否则将会死循环

loop
	代码块;
end loop;

9. iterate

允许跳过剩下的代码进入循环体开始的位置继续执行,类似于java中的continue.

二、自定义函数

函数存储着一系列的SQL语句,调用函数就是一次性执行这些SQL。所以说函数可以减低语句的重复性

语法

create function 函数名([参数列表]) returns 数据类型
begin
	sql语句;
	return 值;
end;

参数格式:参数名 数据类型

实例

create function findSalByNo(eno int) RETURNS INT
BEGIN
	DECLARE sals int DEFAULT 0;
	select sal from emp where empno = eno INTO sals;
	RETURN sals;
END;

调用:
select * from emp where sal > findSalByNo(7782);

三、存储过程和自定义函数的区别

  1. 函数只会有一个返回值,不允许返回结果集,存储过程是可以返回结果集。(函数强调返回值)
  2. 存储过程实现的功能会更加复杂,而函数的针对性比较强。
  3. 存储过程一般是单独执行,而函数往往是结合其他SQL语句来执行的(它是其他SQL语句一部分)
  4. 存储过程的参数区分输入输出参数,函数不区分。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值