一、 视图: 视图(view)是保存了查询语句的一种数据库对象,其数据来源是查询语句对应的数据表,他的结果与数据表查询的结果一样也是一张虚拟的数据表 1、 为什么需要视图: 1) 不同的用户关心的数据可能是不相同的,每个用户可以将关心的数据的查询语句定义为视图,方便以后使用 2) 针对一些不能被所有用户访问的数据可以通过创建视图只公开不需要保密的数据,提高数据的安全性 3) 针对复杂的查询,可以将它保存为视图,以后可以简化查询的操作
2、 视图的创建: 语法: CREATE VIEW<视图名称>AS<查询语句> 举例: CREATE VIEW vw_score AS SELECT id 编号,student_no 学生编号,subject_id 课程编号,exam_date 考试日期 FROM tb_score;
3、 视图的使用:查询视图与查询数据表的操作完全相同
SELECT * FROM vw_score WHERE 课程编号 = 2; -- 课程编号为2的成绩 二、 事务: 1、 什么是事务? 当在执行一些重要的增删改时,往往需要将他们当作一个整体来看待,要么全部执行,要么全部不执行,
当所有操作都正常结束后可以通过commit语句提交,当其中的全部或部分操作失败后,可以通过rollback语句回滚
2、 如何使用事务:事务操作的流程
1) 需要设置数据库管理系统的提交方式为“手动提交“。 SET AUTOCOMMIT = {0|1}; 0表示手动提交,1表示自动体提交,MySQL默认的提交方式为“自动提交“ 2) 开启事务 START TRANSACTION; 3) 执行目标代码:如,转账就是执行两个update操作 4) 若目标代码没有发生异常,执行提交操作(commit),发生异常执行回滚操作(rollback) /*举例:模拟一个转账的事务操作,以Java代码的异常处理模板为例,演示事务操作的流程
try { // 试图执行的目标代码, SET AUTOCOMMIT = 0; START TRANSACTION; UPDATE tb_bank SET amount = amount - 100 WHERE card_no = ; UPDATE tb_bank SET amount = amount + 100 WHERE card_no = ; COMMIT; } catch { //当目标代码发生异常时会执行的代码块。 ROLLBACK; } finally { //不管目标代码是否发生异常,都会被执行的代码块 SET AUTOCOMMIT = 1; }*/
3、 事务的4个特性:ACID 1) 原子性(Atomicity):将事务中的所有操作当作一个整体来看待,要么全部执行,要么不执行 2) 一致性(consistency):事务操作的前后数据要保持一致,如:转账前后的总金额要相同, 3) 隔离性(isolation):事务之间时相互独立的,一个事务不能依赖其他事务执行结果而发生改变 4) 永久性(durability):事务完成后的数据需要永久保存起来
4、 事务的隔离级别: 在SQL规范中针对事务隔离级别设置了4个级别,每一种数据库管理系统都支持这4个级别,所不同的是,默认级别有差异 1) 读未提交(READ UNCOMMITTED):当一个事务正在读取某个数据但还没有提交之前,其他的事务允许去访问该数据。(Oracle的默认值) 2) 读已提交(READ COMMITTED):当一个事务正在读取某个数据但还没有提交之前,不允许其他事务访问该数据,只有前面的事务提交了数据后,才能访问。 3) 可重复读(REPEATABLE READ):当一个事务正在修某个数据但还没有提交之前,其他的事务允许去访问该数据。(MySQL的默认值) 4) 串行化(序列化)(SERIALIZABLE):所有的事务不管是读还是写数据,都必须要依次访问。 注:以上的四个级别依次等级提高,效率越低,但实际应用过程中要根据项目的需求寻找一个安全和效率平衡点作为最佳方案。
5、 查看事务的隔离级别: 通过查看MySQL数据库中保存的事务隔离级别变量来完成,范围有两个:全局(global)、当前会话(session) -- 当前会话隔离级别 SELECT @@session.tx_isolation; -- 全局隔离级别 SELECT @@global.tx_isolation;
6、 修改事务隔离级别: 1) 通过SQL语句完成修改 语法: SET {global | session} transaction isolation level {事务隔离级别}; 2) 通过修改MySQL数据库管理系统的配置文件完成修改: a、 找到MySQL安装路径下的my.ini文件 b、 打开文件找到[mysqld]区域,添加事务隔离级别的配置。 如:transation-isolation = READ-COMMITTED; 注:设置完成后是全局效果,所有的事务隔离级别都被修改