TCL(事务控制语言总结)
所有数据库学习总结文章均是根据B站尚硅谷视频总结而来,视频链接如下:
[https://www.bilibili.com/video/BV12b411K7Zu]
一、事务
1、定义
一个或一组SQL语句组成的执行单元,这个执行单元要么都执行,要么都不执行。
2、事务的属性ACID(经典面试题)
(1)原子性:事务是一个不可分割的执行单元,要么都执行要不都不执行;
(2)一致性:事务必须使数据库从一个一致性变为另一个一致性;
(3)隔离性:一个事务的执行不能被其他事物干扰;
(4)持久性:数据一旦被提交对数据库的影响是永久的。
① 原子性举例:
银行转账
A用户帐户余额减少1000元;B用户帐户余额增加1000元;
记录A用户的交易日志;记录B用户的交易日志。
一次交易产生四次数据库操作,要么全部都成功,如果有一个失败,其它操作也应该全部被撤销。
②一致性的举例:
例如:有A和B两人通过微信转账,转账钱两人总钱数为300,转账后两人总钱数任为500.
3、事务的创建
(1)隐式事务的创建:事务没有明显的开启和结束的标记。比如:insert,update,delete语句都是。
(2)显式事务的创建:事务具有明显的开启和结束标志。创建前提是:必须先设置自动提交功能为禁用,具体设置如下:
SHOW VARIABLES LIKE 'autocommit'; #查看自动提交的状态
SET autocommit =0; #设置自动提交为禁用
①显式事务的创建步骤:
SET autocommit = 0; #设置自动提交功能为禁用
START TRANSACTION;#开启事务,此语句可省略
编写事务SQL语句,可以有多条,
但只支持这几种:select,insert,update delete
COMMIT; #提交事务 或
ROLLBACK; #回滚事务,相当于撤销功能
4、事物的隔离
(1)为何要进行事物的隔离?
因为对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离措施,会导致各种并发问题。
(2)常见的并发问题
①脏读:有T1和T2两个事务同时执行, T1读取了T2更新了但还没有提交的数据,若此时T2回滚不提交,则T1读到的数据是无效的(主要针对更新的数据)。
②不可重复读:有T1和T2两个事务同时执行,T1先查询了一个字段,然后T2又更新了该字段,之后T1再读取该字段会出现和第一次读取的不一样的值。
③幻读:有T1和T2两个事务同时执行,T1先读取了表中的数据(例如有3行数据),然后修改了表中的数据但还没有执行该语句,此时T2又为表插入1行数据,当T2插入完数据后并提交后,T1再执行为执行的语句,此时会看到有4行数据受影响,但之前查询的T1表中只有3行数据,貌似出现幻觉。
(3)事物的隔离级别
①read uncommittted(读未提交):上述三种并发问题均会出现;
②read committed(读已提交):避免出现脏读,其他两类还会出现;
③repeatable read(可重复读):避免脏读和不可重复的,会出现幻读;
④serializable(串行化):以上并发问题均可避免,但比较耗费存储空间。
MYSQL以上四种隔离级别都支持,默认为:repeatable read;
oracle中支持read committed和serializable,默认隔离级别为read committed。
(4)查看隔离级别(MYSQL8)
select
@@global.transaction_isolation, #全局隔离级别
@@transaction_isolation; #当前会话隔离级别
(5)设置隔离级别
#设置全局隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别;
#设置当前会话隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别;
5、事物的删除
(1)delete删除,只删除数据,但不释放空间。
语法:delete from 表名 where ····;
(2)truncate,删除表中所有数据,并回收存储空间。
语法:TRUNCATE from 表名 ;
(3)delete和truncate在事务中的区别:delete支持事务回滚;truncate不支持回滚
6、Savapoit的使用:
Savapoit可以设置保存点,可让事务回滚到保存点处。使用案例案例:
SET autocommit = 0;
START TRANSACTION;
DELETE FROM account WHERE id=1;
SAVEPOINT a; #设置保存点
DELETE FROM account WHERE id =2;
ROLLBACK TO a; #回滚到保存点片
二、视图
1、含义:
视图是一个虚拟表,是通过表动态生成的数据,使用方法和普通表一样。
2、优点:
重用SQL语句,简化了复杂的操作,保护数据提高安全性。
3、视图的创建
(1)语法:
CREATE VIEW 视图名
AS
查询语句;
(2)案例
案例1:查询姓名中包含a字符的员工名、部门名和工种信息。
#①创建视图
CREATE VIEW em
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 j.job_id=e.job_id;
#①使用
SELECT * FROM em WHERE last_name LIKE '%a%';
案例2:查询各部门的平均工资级别。
#创建视图
CREATE VIEW avg_salary
AS
SELECT AVG(salary) ag,department_id
FROM employees
GROUP BY department_id;
#查询平均工资级别
SELECT grade_level,avg_salary.`department_id`
FROM job_grades job
INNER JOIN avg_salary
ON ag BETWEEN `lowest_sal`AND`highest_sal`;
4、视图的修改、删除和查看
(1)视图修改
#方式一:
create or replace view 视图名 #如果存在就修改,不存在就创建
as
查询语句;
#方式二:
alter view 视图名
as
查询语句;
(2)视图删除
drop view 视图名1,视图名2,···;
(3)视图的查看
DESC 视图名;
SHOW CREATE VIEW 视图名;
5、视图的更新(很少使用)
(1)具备以下特点的视图不允许更新
①包含以下关键字的语句:分组函数、GROUP BY、HAVING、DISTINCT、UNION、UNION ALL;
②常量视图。
#例如:
create view myv
as
select 'hhah' name;
③SELECT中包含子查询;
④连接join;
⑤FROM后边是一个不能更新的视图;
⑥where子句的子查询引用了from子句中的表。
(2)视图更新案例
#创建视图
CREATE OR REPLACE VIEW emp_v1
AS
SELECT last_name,`email`
FROM employees;
#1、插入数据
INSERT INTO emp_v1 VALUES('小m','222hh@r');
#2、修改数据
UPDATE emp_v1 SET last_name = '小李' WHERE last_name = '小王';
#3、删除数据
DELETE FROM emp_v1 WHERE last_name='小m';
6、视图和表的比较
