#TCL 语言 #transaction control language 事务控制语言 #事务:一个或一组SQL语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。 /*innodb引擎支持事物*/ #1、事务的ACID属性(原一隔持) /* (1)原子性 一个事物不可分割,要么都发生要么都不发生 (2)一致性 consistency 一个事务执行从一个一致性状态到另一个一致性状态 (3)隔离性 并发执行的各个事务之间不能互相干扰 (4)持久性 一个事物一旦提交,对数据库的数据的改变就是永久性的 */ #2、事务的创建 /* (1)隐式事务:没有明显的开启和结束标记 例如insert、update、delete (2)显式事务:事务具有明显的开启和结束的标记 前提:必须先设置自动提交功能为禁用 set autocommit=0 #只针对当前事物有效 步骤1:开启事务 set autocommit=0; start transaction;[可选的] 步骤2:编写事务的SQL语句(select insert update delete) 步骤3:结束事务 commit;#提交事务 rollback; #回滚事务 */ #开启事物 SET autocommit=0; START TRANSACTION; #编写事务的语句 UPDATE `tab_8` SET `name`="c" WHERE `id`=1; UPDATE `tab_8` SET `name`="e" WHERE `id`=2; #关闭事务 COMMIT; #rollback ,回滚需要结束条件,么有结束条件只保存到内存中,不会对磁盘文件修改 #3、并发事物的解决 /* 多个事物访问数据库中相同的数据,如果没有采取必要的隔离机制,会导致各种并发问题 (1)脏读 (2)不可重复读(针对update) (3)幻读(针对insert) MySQL支持四种隔离级别 脏读 幻读 不可重复读 read uncommitted: ✔ ✔ ✔ read committed: × ✔ ✔ repeatable read: × × ✔ serializable: × × × mysql中默认 第三个隔离级别 repaeatable read oracle 默认第二个 read committed 命令: #查看隔离级别 select @@tx_isolation; set session|global transaction isolation level 隔离级别; 4、savepoint的使用 */ #开启事物 SET autocommit=0; START TRANSACTION; #编写事务的语句 UPDATE `tab_8` SET `name`="c" WHERE `id`=1; SAVEPOINT a;#设置回滚点 UPDATE `tab_8` SET `name`="e" WHERE `id`=2; #关闭事务 ROLLBACK TO a; #回滚到保存点 #另外:delete 支持回滚,truncate不支持回滚 #视图 /* 含义:虚拟表,和普通表一样使用 MySQL 5.1 版本出现的新特性,通过表动态生成的数据 应用场景: 一、多个地方用到同样的查询结果 二、该查询结果使用的SQL语句较复杂 (1)创建 create view 视图名 as 查询语句; */ # 1、查询邮箱中包含a字符的员工名、部门名和工种信息 CREATE VIEW info AS SELECT e.`last_name`,d.`department_name`,j.* FROM `employees` e INNER JOIN `departments` d ON d.`department_id` = e.`department_id` INNER JOIN `jobs` j ON e.`job_id` = j.`job_id`; SELECT `last_name`,`department_name`,`job_id`,`job_title` FROM info WHERE `last_name` LIKE "%a%"; /* 好处: (1)重用SQL语句 (2)简化了复杂的SQL操作,不必知道它的查询细节 (3)保护数据,提高安全性 */ #(2)视图的修改 /* 方式一: create or replace view 视图名 as 查询语句 方式二: 语法: alter view 视图名 as 查询语句 */ #(3)视图的删除 /* 语法:drop view 视图1,视图2 */ #(4)查看视图 DESC info; #(5)视图的更新 /*插入 insert into 修改 uodate set 删除 drop 注意: 具备以下特点的视图不允许更新: (1)包含以下关键字的SQL语句:分组函数、distinct、group by、having、union 或者union all (2)常量视图 (3)select 中包含子查询 (4)join (5)from 一个不能更新的视图 (6)where子句的子查询引用了from中的表 */ #对比 是否占用空间 增删改查 /*视图 create view 几乎不占用 一般不支持 表 create table 占用 支持 */ #测试题 #创建book表 CREATE TABLE book( bid INT PRIMARY KEY, bname VARCHAR(20) UNIQUE NOT NULL, price DOUBLE DEFAULT 10, #foreign key(typeId) references bookType(id) );