SQL 视图与事务知识点详解及练习题
在数据库操作中,视图和事务是非常重要的概念,它们在数据管理和操作一致性方面发挥着关键作用。下面我们将详细介绍视图和事务的相关知识,并通过练习题来巩固理解。
一、知识点梳理
(一)视图
- 作用:常用于保存复杂的 SQL 语句,是一张虚拟表。
- 格式:create or replace view 视图名称 as select...... with check option
- 操作:可进行 select、insert、update、delete 操作,依赖于真实表。
- 注意:视图基于单表时,可进行 dml 操作,不用于分组函数或多表查询;条件视图(with check option)进行 dml 操作时必须满足条件。
(二)事务
- 依赖:事务依赖于 InnoDB 存储引擎。
- 四大特征:原子性(A)、一致性(C)、隔离性(I)、持久性(D)。
- 操作:start transaction(开始事务);sql 语句(dml 操作);commit(提交事务);rollback(回滚事务)。
- 隔离性的 4 个隔离级别(从低到高):读未提交、读已提交、可重复读、序列化。
- 锁的分类
- 共享锁(s 锁):特征是多个事务可读取相同的数据,但阻止修改,通过 select .... lock in share mode 添加。
- 排他锁(x 锁):特征是一个事务拥有排他锁后独占资源,提交或回滚后释放资源,通过 select .... for update 添加。
- 表锁:特征是锁定整张表。lock tables 表名 read(共享读锁,类似于 s 锁,unlock tables 释放锁资源);lock tables 表名 write(排他锁,独享资源,不建议使用)。
- 注:可通过程序或框架配置及注解进行事务操作。dml 操作默认为自动提交 commit。
二、练习题及解析
(一)选择题
- 以下关于视图的说法,正确的是( )
A. 视图是一张真实存在的表
B. 视图不能用于保存复杂的 SQL 语句
C. 视图基于单表时,一定可以进行 DML 操作
D. 带有 with check option 的条件视图,进行 DML 操作时必须满足条件
答案:D
解析:视图是虚拟表,并非真实存在,A 选项错误;视图的作用之一就是常用于保存复杂的 SQL 语句,B 选项错误;视图基于单表时,若不涉及分组函数等情况可进行 DML 操作,但不是一定可以,C 选项错误;带有 with check option 的条件视图,进行 DML 操作时必须满足条件,D 选项正确。
- 事务的四大特征不包括( )
A. 原子性
B. 连续性
C. 隔离性
D. 持久性
答案:B
解析:事务的四大特征是原子性(A)、一致性(C)、隔离性(I)、持久性(D),不包括连续性,所以选 B。
- 下列哪种隔离级别是 MySQL InnoDB 存储引擎的默认隔离级别( )
A. 读未提交
B. 读已提交
C. 可重复读
D. 序列化
答案:C
解析:MySQL InnoDB 存储引擎的默认隔离级别是可重复读,所以选 C。
- 关于共享锁(S 锁)的特征,说法正确的是( )
A. 阻止多个事务读取相同的数据
B. 允许多个事务读取相同的数据,但阻止修改
C. 一个事务拥有后独占资源
D. 以上说法都不正确
答案:B
解析:共享锁的特征是多个事务可读取相同的数据,但阻止修改,A 选项错误,B 选项正确;C 选项是排他锁的特征,所以选 B。
(二)简答题
- 简述视图的作用和格式。
答案:视图的作用是常用于保存复杂的 SQL 语句,它是一张虚拟表。其格式为 “create or replace view 视图名称 as select...... with check option”。
解析:视图本质是虚拟表,主要用于存储复杂 SQL,方便后续调用,格式中 “create or replace” 用于创建或替换视图,“as” 后接对应的 select 语句,“with check option” 是可选的条件约束。
- 事务操作的基本语句有哪些?
答案:事务操作的基本语句有:start transaction(开始事务);sql 语句(DML 操作);commit(提交事务);rollback(回滚事务)。
解析:start transaction 用于开启一个事务,之后执行具体的 DML 操作,若操作无误,用 commit 提交事务,使修改生效;若出现错误,用 rollback 回滚事务,恢复到事务开始前的状态。
- 锁有哪些分类?各自的特征是什么?
答案:锁主要分为以下几类:
- 共享锁(S 锁):特征是多个事务可读取相同的数据,但阻止修改,可通过 “select .... lock in share mode” 添加。
- 排他锁(X 锁):特征是一个事务拥有排他锁后独占资源,提交或回滚后释放资源,可通过 “select .... for update” 添加。
- 表锁:特征是锁定整张表。其中 “lock tables 表名 read” 是共享读锁,类似于 S 锁,可通过 “unlock tables” 释放锁资源;“lock tables 表名 write” 是排他锁,独享资源,不建议使用。
解析:不同类型的锁适用于不同场景,共享锁适合多事务读取数据的情况,排他锁适合需要独占资源修改数据的场景,表锁则会锁定整张表,可能影响并发性能。
(三)案例分析题
现有一个学生表(student),包含字段:id(学号)、name(姓名)、age(年龄)、score(成绩)。
- 请创建一个视图 v_student,要求包含年龄大于 18 岁的学生的 id、name 和 score 信息,且带有 with check option。
答案:create or replace view v_student as select id, name, score from student where age > 18 with check option;
解析:按照视图创建格式,指定视图名称 v_student,select 语句选取所需字段,添加年龄大于 18 岁的条件,最后加上 with check option 约束。
- 若通过视图 v_student 插入一条年龄为 17 岁的学生记录,会出现什么情况?为什么?
答案:插入会失败。因为视图 v_student 带有 with check option,进行插入操作时必须满足视图定义的条件(年龄大于 18 岁),而插入的记录年龄为 17 岁,不满足条件,所以插入失败。
解析:with check option 会强制要求通过视图进行的 DML 操作必须满足视图定义时的条件,确保视图数据的一致性。
- 有一个事务,首先开启事务,然后将学生表中 id 为 1 的学生的成绩修改为 90 分,之后回滚事务,请问该学生的成绩最终是多少?为什么?
答案:该学生的成绩最终还是原来的分数。因为事务进行了回滚操作,回滚会撤销事务中所有的 DML 操作,使数据恢复到事务开始前的状态,所以修改操作被撤销,成绩不变。
解析:事务的回滚机制保证了在事务执行过程中出现错误时,数据可以恢复到初始状态,体现了事务的一致性和原子性。