事务
TCL(Transaction Control Language):事务控制语言
事务:一个或一组SQL语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。如果执行失败,事务将回滚到执行之前的状态
SHOW ENGINES:查看数据库引擎
在MySQL中使用最多的存储引擎:INNODB、MyISAM、MEMORY。INNODB支持事务,MyISAM、MEMORY不支持事务
ACID:
原子性(Atomicity):指事务是一个不可分割的工作单位,事务中的操作要么全部执行,要么全部不执行
一致性(Consistency):事务必须使数据库从一个一致性状态换到另一个一致性状态
隔离性(Isolation):指一个事务的执行不能被其它事务干扰,即一个事务内部的操作及使用的数据对并发的其它事务是隔离的,并发执行的各个事务之间不能互相干扰
持久性(Atomicity):指一个事务一旦被提交,它对数据库中数据的改变是永久性的,接下来的其它操作和数据库故障不应该对其有任何影响
事务的创建:
隐式事务:事务没有明显的开启和结束的标记。如INSERT,UPDATE,DELETE。
显示事务:事务有明显的开启和结束的标记。前提是必须先将自动提交设置为禁用,autocommit=0,该操作只针对本次事务有效。
步骤1:开启事务
SET autocommit=0;
[START TRANSACTION;]
步骤2:编写事务中的SQL语句
语句1;
…
步骤3:结束事务
COMMIT;提交
ROLLBACK;回滚
MySQL隔离级别:read uncommitted,read committed(可以避免脏读),repeatable read(可以避免脏读、不可重复读),serializable(可以避免脏读、不可重复读、幻读,效率低)
MySQL默认repeatable read,oracle默认read committed
设置隔离级别:SET SESSION|GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别
查看当前隔离级别:SELECT @@tx_isolation;
每启动一个MySQL查询,就会获得一个单独的数据库连接,每个数据库连接都有一个全局变量 @@tx_isolation,表示当前的事务隔离级别
SAVEPOINT:保存点,搭配rollback
SET autocommit=0;
START TRANSACTION;
UPDATE major SET majorName='java' WHERE majorName='python';
SAVEPOINT a;
INSERT INTO major VALUES(3,'c');
ROLLBACK TO a;
视图
视图:虚拟表,只保存SQL逻辑,不保存查询结果
应用场景:多个地方使用到同样的查询结果(重用),该查询结果的SQL有点复杂
保护数据,提供安全性
下面的情况不能更新视图:(一般不增删改)
- 包含分组函数,DISTINCT,GROUP BY,HAVING,UNION,UNION ALL,JOIN等
- SELECT中包含子查询
- FROM一个不能更新的视图
- WHERE子句的子查询引用了FROM子句中的表
#一、视图的创建
#查询姓名中包含a的员工名,部门名,工种信息
CREATE VIEW view1 AS
SELECT last_name,department_name,job_title FROM employees e
INNER JOIN departments d ON e.department_id=d.department_id
INNER JOIN jobs j ON e.job_id=j.job_id;
SELECT * FROM view1 WHERE last_name LIKE '%a%';
#查询各部门的平均工资级别
drop view view2
CREATE VIEW view2 AS
SELECT t.*,grade_level FROM job_grades INNER JOIN (
SELECT department_id,AVG(salary) AS av FROM employees GROUP BY department_id) AS t
ON t.av BETWEEN lowest_sal AND highest_sal;
SELECT * FROM view2;
#二、视图的修改
#方式一:CREATE OR REPLACE VIEW 视图名 AS 查询语句
CREATE OR REPLACE VIEW view2 AS
SELECT * FROM employees;
#方式二:ALTER VIEW 视图名 AS 查询语句
ALTER VIEW view2 AS
SELECT * FROM employees;
#三、删除视图
#DROP VIEW 视图名,视图名…
#四、查看视图
SHOW CREATE VIEW view2;