数据库TCL语言的学习
Posted 黑黑白白君
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库TCL语言的学习相关的知识,希望对你有一定的参考价值。
文章目录
相关的背景知识:
- 本栏的《【数据库(一)】数据库基础知识及MySQL常用命令》(https://blog.csdn.net/m0_37621024/article/details/116547612)
- 本栏的《【数据库(二)】SQL语言以及DQL的学习》(https://blog.csdn.net/m0_37621024/article/details/116561545)
- 本栏的《【数据库(三)】DML和DDL的学习》(https://blog.csdn.net/m0_37621024/article/details/116564818)
1)什么是TCL语言?
TCL(Transaction Control Language)即事务控制语言。
有时候我们的一个需求(一个任务),可能会涉及到多个DML(增删改)操作。那么这一系列操作, 我们要看成一个整体,不可切割。
如在一个员工系统中,某员工A的数据可能会存在多个表中,如基本信息表,业务信息表,邮箱信息表等。当我们想删除此人的所有信息时,除了删除这个人的基本信息外,还应该删除与此人有关的其他所有信息,如邮箱,地址等等。这样的操作会涉及到多个DML语句。那么从开始执行到真正结束,就会构成一个事务(Transaction)。对于事务,我们要保证事务的完整性,不能分割。事务要么成功, 要么撤回(回到执行前),不能执行一部分就终止。
注意,只有DML操作时,才会涉及到事务。而mysql数据库在执行完每一个DML操作时,会默认commit; 可以使用start transaction来取消自动提交
2)事务
2.1 什么是事务?
事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句一旦执行失败或产生错误,整个单元将会回滚,所有受到影响的数据将返回到事物开始以前的状态。如果单元中的所有SQL语句均执行成功,则事物被顺利执行。
举例:
转账
update 表 set 张三丰的余额=500 where name=‘张三丰’
update 表 set 郭襄的余额=500 where name=‘郭襄’
2.2 存储引擎
-
概念:在mysql中的数据用各种不同的技术存储在文件(或内存)中。
-
通过
show engines;
来查看mysql支持的存储引擎。 -
在mysql中用的最多的存储引擎有:innodb,myisam ,memory 等。其中innodb支持事务,而myisam、memory等不支持事务。
2.3 事务的属性(ACID)【重点】
- 原子性(Atomicity):要么都执行,要么都回滚。
- 一致性(Consistency):保证数据的状态操作前和操作后保持一致。
- 隔离性(Isolation):多个事务同时操作相同数据库的同一个数据时,一个事务的执行不受另外一个事务的干扰。
- 持久性(Durability):一个事务一旦提交,则数据将持久化到本地,除非其他事务对其进行修改。
2.4 事务的分类
-
隐式事务(没有明显的开启和结束事务的标志)
比如 insert、update、delete语句本身就是一个事务
-
显式事务(具有明显的开启和结束事务的标志)
1、开启事务
set autocommit=0; start transaction; 【可选】
- 取消自动提交事务的功能(只针对当前会话有效):
set autocommit=0;
2、编写事务的一组逻辑操作单元(多条sql语句)
- select
- insert
- update
- delete
3、提交事务或回滚事务
- 提交事务
commit;
- 回滚事务
rollback;
- 设置节点(保存点)
savepoint;
-
搭配rollback使用,回滚到保存点:
SET autocommit=0; START TRANSACTION; DELETE FROM account WHERE id=1; SAVEPOINT a; DELETE FROM account WHERE id=5; ROLLBACK TO a;
-
- 取消自动提交事务的功能(只针对当前会话有效):
2.5 事务的隔离级别:
2.5.1 事务并发问题如何发生?
对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题。
2.5.2 并发问题类型
-
脏读:
一个事务读取到了另外一个事务未提交的数据。针对的是更新。
-
不可重复读:
同一个事务中,多次读取到的数据不一致。
-
幻读:
一个事务读取数据时,另外一个事务进行更新,导致第一个事务读取到了没有更新的数据。针对的是插入。
2.5.3 如何避免事务的并发问题?
-
通过设置事务的隔离级别:
1、READ UNCOMMITTED
2、READ COMMITTED
可以避免脏读
3、REPEATABLE READ
可以避免脏读、不可重复读和一部分幻读。
4、SERIALIZABLE
可以避免脏读、不可重复读和幻读(有锁,所以效率会低一些)。
- Mysql
Mysql支持 4 种事务隔离级别.
Mysql 默认的事务隔离级别为: REPEATABLE READ- Oracle
Oracle 支持的 2 种事务隔离级别:READ COMMITED, SERIALIZABLE。
Oracle 默认的事务隔离级别为: READ COMMITED
3)视图
3.1 什么是视图?
MySQL从5.0.1版本开始提供视图功能。是一种虚拟存在的表,行和列的数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的,只保存了sql逻辑,不保存查询结果。
- 应用场景:
- 多个地方用到同样的查询结果
- 该查询结果使用的sql语句较复杂
- 视图的好处:
- sql语句提高重用性,效率高
- 和表实现了分离,提高了安全性
-
视图VS表:
-
创建
视图:CREATE VIEW 表:CREATE TABLE
-
物理空间
- 视图:只保存了sql逻辑
- 表:保存了数据
-
使用
- 视图:支持增删改查,但一般只查
-
3.2 常见操作
-
创建视图
CREATE VIEW 视图名 AS 查询语句;
-
查看视图数据
SELECT * FROM 视图 WHERE email LIKE '%a%';
-
查看视图
DESC 视图名; # 或者 SHOW CREATE VIEW 视图名;
-
修改视图
#方式一: CREATE OR REPLACE VIEW 视图名 AS 查询语句; #方式二: ALTER VIEW 视图名 AS 查询语句;
-
删除视图
DROP VIEW 视图名,视图名,... ;
-
视图的更新
以上是关于数据库TCL语言的学习的主要内容,如果未能解决你的问题,请参考以下文章