一、事务
概念
由一条或者多条sql语句组成,要么都执行成功,要么都执行失败。
TCL :Transaction Contral Language 事务控制语音
分类
-
隐式事务:没有明显的开启和结束标记;
比如DML中的select、update、delete等语句本身就是一个事务。
-
显式事务:有明显的开启和结束标记。
一般由多条sql语句组成,有明显的开启和结束标记。
步骤:
-
先取消隐式事务自动开启的功能
-
开启事务。
-
编写事务需要的sql语句(1条或多条)。
-
结束事务。
-
演示事务的使用步骤
SHOW VARIABLES LIKE '%auto%';#查看系统变量
1.取消事务自动开启
SET AUTOCOMMIT = 0;
2.开启事务
(可选的 ,只要有SET AUTOCOMMIT = 0 可以不写START TRANSACTION)
START TRANSACTION ;#可选的 只要有SET AUTOCOMMIT = 0 可以不写START TRANSACTION
3.编写事务sql语句
(一般是select,insert,delete,update)
UPDATE stronginfo SET height=height-50 WHERE id=1;
UPDATE stronginfo SET height=height+50 WHERE id=2;
4.结束事务
#.1 提交 正常直接提交
COMMIT;
#.2 回滚 有异常直接回滚
ROLLBACK;
SAVEPOINT
语法: SAVEPOINT 回滚点名; 搭配 ROLLBACK TO 回滚点名; 使用
设置保存点,回滚到保存点时,前面的语句执行,保存点之后的不执行
# SAVEPOINT 使用
SET AUTOCOMMIT = 0;
START TRANSACTION ;
DELETE FROM stronginfo WHERE id=2;
SAVEPOINT a;#设置保存点,回滚到保存点时,前面的语句执行,保存点之后的不执行
DELETE FROM stronginfo WHERE id=3;
ROLLBACK TO a;#回滚到保存点
数据库存储引擎
事务的隔离级别
各隔离级别会出现的错误:
脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
read uncommitted | √ | √ | √ |
read committed | × | √ | √ |
repeatable read | × | × | √ |
serializable | × | × | × |
- mysql中默认隔离级别 : repeatable read
- oracle中默认隔离级别 : read committed
关于隔离级别命令:
-
查看隔离级别
SELECT @@tx_isolation;
-
设置隔离级别
SET SESSION(GLOBAL) TRANSACTION ISOLATION LEVEL 隔离级别;
二、视图
1.创建视图
概念:视图的含义是一张 虚拟表,可以和普通表一样使用。是通过表动态生成的数据。
语法
create view 视图名
as
查询语句; (一般是复杂的查询语句,不然没必要用到视图)
优点
- 重用sql语句
- 简化复杂的sql操作
- 保护数据,提高安全性
#查询姓名中包含a字符的员工名,部门名和工种信息
#.1
CREATE VIEW v2
AS
SELECT last_name,department_name,job_title
FROM employees e
JOIN departments d ON e.department_id = d.department_id
JOIN jobs j ON e.job_id = j.job_id;
#.2
SELECT * FROM v2
WHERE last_name LIKE '%a%';
- 查询各部门平均工资的级别
#.1 创建视图各部门平均工资
CREATE VIEW v4
AS
SELECT AVG(salary) av,department_id
FROM employees
GROUP BY department_id;
#.2 使用视图
SELECT v4.av,j.grade_level
FROM v4
JOIN job_grades j
ON v4.av BETWEEN j.lowest_sal AND j.highest_sal;
- 查询平均工资最低的部门
SELECT *
FROM v4
ORDER BY v4.av
LIMIT 1;
#查询平均工资最低的部门信息
CREATE VIEW v5
AS
SELECT *
FROM v4
ORDER BY v4.av
LIMIT 1;
SELECT v5.av,d.*
FROM v5
JOIN departments d
ON v5.department_id = d.department_id;
2.视图修改
语法
-
create or replace view 视图名
as 查询语句;
-
alter view 视图名
as 查询语句;
3.删除视图
语法
drop view 视图名, 视图名, …;
DROP VIEW v4,v3;
4.查看视图
语法
DESC v5;
SHOW CREATE VIEW v5;
5.视图的更新
CREATE OR REPLACE VIEW myv1
AS
SELECT last_name,email
FROM employees;
1 插入
插入之后原始表的数据也会发生改变
INSERT INTO myv1 VALUES('张三','sanzhang@qq.com');
2 修改
UPDATE myv1 SET last_name='李四'
WHERE last_name='张三';
3 删除
DELETE FROM myv1 WHERE last_name='李四';
视图和表的区别
创建语法的关键字 | 是否实际占用物理空间 | 使用 | |
---|---|---|---|
视图 | create or replace view 视图名 as | 只保存sql逻辑 | 增删改查,只是一般不能增删改 |
表 | create table if not exists 表名 | 保存数据 | 增删改查 |