事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响
2.开启事务
# 关闭自动提交 set autocommit=0; #开启事物(可选) start transaction;
3.结束事务
commit;提交事务 # 或者 rollback;回滚事务 # 或者 rollback to 回滚点名;回滚到指定的地方
4.并发事务
事务的并发问题是如何发生的?
多个事务 同时 操作 同一个数据库的相同数据时
并发问题都有哪些?
脏读: 对于两个事务 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的
不可重复读: 对于两个事务T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同了(在一个事物中不管读多少次,读取的数据应该都一样)
幻读: 对于两个事务T1, T2, T1 从一个表中读取了一个字段, 然后 T2 在该表中插入了一些新的行. 之后, 如果 T1 再次读取同一个表, 就会多出几行
如何解决并发问题
通过设置隔离级别来解决并发问题
5.事务隔离级别
隔离级别 脏读 不可重复读 幻读read uncommitted:读未提交 × × ×
read committed:读已提交 √ × ×
repeatable read:可重复读 √ √ ×
serializable:串行化 √ √ √
6.查看隔离级别
select @@tx_isolation;
7.设置隔离级别
# 设置当前 mySQL 连接的隔离级别: set transaction isolation level read committed; # 设置数据库系统的全局的隔离级别: set global transaction isolation level read committed;
十四.视图
MySQL从5.0.1版本开始提供视图功能。一种虚拟存在的表,行和列的数据来自定义视图的查询中 使用的表,并且是在使用视图时动态生成的,只保存了sql逻辑,不保存查询结果
1.创建视图
create view 视图名 as 查询语句;
例1:创建视图emp_v2,要求查询部门的最高工资高于12000的部门信息
# 创建视图,查询每个部门的最高工资,筛选出高于12000的 DROP VIEW emp_v2; CREATE VIEW emp_v2 AS SELECT department_id, MAX( salary ) max_salary FROM employees GROUP BY department_id HAVING max_salary > 12000;
# 根据创建的视图连接departments表查询部门信息 SELECT d.*, ev2.max_salary FROM departments d JOIN emp_v2 ev2 ON d.department_id = ev2.department_id;
2.修改视图
create or replace view 视图名 as 查询语句;
3.删除视图
drop view 视图名,视图名,...
4.查看视图
DESC 视图名;
5.视图的更新
视图的可更新性和视图中查询的定义有关系,以下类型的视图是不能更新的。
包含以下关键字的sql语句:分组函数、distinct、group by
having、union或者union all
常量视图
Select中包含子查询
join
from一个不能更新的视图
where子句的子查询引用了from子句中的表
十五.存储过程
什么是存储过程:事先经过编译并存储在数据库中的一段sql语句的集合。类似于java中的方法
1.创建语法
CREATE PROCEDURE 存储过程名(参数列表) BEGIN 存储过程体(一组合法的SQL语句) END
例1:插入到admin表中五条记录
USE girls; DELIMITER $ CREATE PROCEDURE myp1() BEGIN INSERT INTO admin(username,`password`) VALUES ('john1','0000'),('lily','0000'),('rose','0000'),('jack','0000'),('tom','0000'); END $
2.调用语法
CALL 存储过程名(实参列表);
3.创建带IN模式参数的存储过程
例1:创建存储过程实现 根据女神名,查询对应的男神信息
DELIMITER $ CREATE PROCEDURE myp2(IN beautyName VARCHAR(20)) BEGIN SELECT bo.* FROM boys bo RIGHT JOIN beauty b ON bo.id = b.boyfriend_id WHERE b.name=beautyName; END $
CALL myp2('赵敏');
4.创建out模式参数的存储过程
例1:根据输入的女神名,返回对应的男神名
DELIMITER $ CREATE PROCEDURE myp4(IN beautyName VARCHAR(20),OUT boyName VARCHAR(20)) BEGIN SELECT bo.boyname INTO boyname FROM boys bo RIGHT JOIN beauty b ON b.boyfriend_id = bo.id WHERE b.name=beautyName ; END $
# 调用 使用自定义变量接收 CALL myp4('赵敏',@name); SELECT @name;
5.创建带inout模式参数的存储过程
例1:传入a和b两个值,最终a和b都翻倍并返回
DROP PROCEDURE IF EXISTS myp5; DELIMITER $ CREATE PROCEDURE myp5(INOUT a INT,INOUT b INT) BEGIN SET a:=a*2; SET b:=b*2; END $
SET @m=10; SET @n=20; CALL myp5(@m,@n); SELECT @m,@n;
十六.存储函数