MySQL学习总结(八)——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、视图和表的比较

在这里插入图片描述


版权声明:本文为weixin_45663534原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。