#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)
);