事务(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.将重复性很高的操作,封装到一个存储过程中,简化了SQL的调用
2.可利用存储过程批量处理数据
3.统一接口,确保数据安全
4.运行速度比较快。
缺点
1.增加SQL的代码维护性
2.移植比较困难
3.不方便调试
参数
- IN输入参数:表示调用者向存储过程传入值(可以是常量值也可以是一个变量)
- OUT输出参数:表示存储过程向调用者传出值(传出的值必须是变量)
- 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);
三、存储过程和自定义函数的区别
- 函数只会有一个返回值,不允许返回结果集,存储过程是可以返回结果集。(函数强调返回值)
- 存储过程实现的功能会更加复杂,而函数的针对性比较强。
- 存储过程一般是单独执行,而函数往往是结合其他SQL语句来执行的(它是其他SQL语句一部分)
- 存储过程的参数区分输入输出参数,函数不区分。