TCL
事务的创建
分为隐式事务:没有明显的开启和结束标记
显式事务:有
set autocommit =0
必须先设置自动提交功能为禁止才能进行显式事务的进行
#第一步
set autocommit=0;#设置自动提交功能为禁止
start transaction;#可选的
#第二步编写事务的sql语句(select insert update delete)
#第三步结束事务
/*commit;提交事务#二选一
rollback;回滚事务*/
#案例
SET autocommit=0;
START TRANSACTION;
UPDATE account SET balance=1000 WHERE username='张';
UPDATE account SET balance=1000 WHERE username='找';
#commit;
ROLLBACK;
SELECT * FROM account;
事务的隔离级别
出现并发问题:
脏读:读取了已经无效的字段,如T1改了数据之后,T2在T1事务为结束时,对元素进行修改则T2改的无效
不可重复读:当T1读取字段T2更新了这个字段,T1在读取时发生改变
幻读:主要是针对插入,T1开始事务并要修改前,T2插入了新行,T1则将改已经改的值
select @@tx_isolation;#显示事务的隔离级别
set session transaction isolation level {read uncommitted};#设置隔离级别
set global transaction isolation level {read committed};#设计全局隔离级别
脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
read uncommitted | 1 | 1 | 1 |
read committed(oracle默认级别) | 0 | 1 | 1 |
repeatable read(mysql默认级别) | 0 | 0 | 1 |
serializable | 0 | 0 | 0 |
回滚点
savepoint
SET autocommit = 0;
START TRANSACTION;
DELETE FROM account WHERE id =1;
SAVEPOINT a;
DELETE FROM account WHERE id =2;
ROLLBACK TO a;
#delete
SET autocommit=0;
START TRANSACTION;
DELETE FROM account;
ROLLBACK;
#可以回滚
#truncate
SET autocommit=0;
START TRANSACTION;
TRUNCATE TABLE account;
ROLLBACK;
#无法回滚
视图
虚拟表,和普通表一样使用,通过表动态生成的数据。
临时的
视图基础操作
视图创建修改删除
#创建视图
#语法
/*
create view 视图名
as
查询语句;
*/
#案例
CREATE VIEW myv1
AS
SELECT last_name,department_name,job_title
FROM employees e
JOIN departments d ON e.department_id = d.department_id
JOIN jobs j ON j.job_id = e.job_id;#创建
#使用
SELECT * FROM myv1 WHERE last_name LIKE '%a%';
#修改视图
#方式一
create or replace view 视图名
as
查询语句;
#案例
CREATE OR REPLACE VIEW myv3
AS
SELECT AVG(salary),job_id
FROM
employees
GROUP BY job_id;
#方式二
alter view 视图名
as
查询语言;
#案例
ALTER VIEW myv3
AS
SELECT * FROM employees;
#删除视图
drop view 视图名,.....;
#案例
DROP VIEW myv1,myv2;
#查看视图
desc 视图名;
show create view 视图名;
视图的更新
主要看是否在原表中储存数据
以下不允许更新
1.含有关键字的sql
语言:分组函数,distinct,group by,having,union或union all
2.常量视图
3.select中包含子查询
4.join,
5.from一个不能更新的视图
6.where子句的子查询引用from子句中表
#插入
INSERT INTO myv1 VALUES("张",'jal');#原始表会同时进行插入
#修改
update myv1 set last_name='zhang' where last_name='张';#原始表会同时进行修改
#删除
DELETE FROM myv1 WHERE last_name='zhang';#原始表会同时进行修改
创建 | 占用物理空间 | 使用增删改 | |
---|---|---|---|
视图 | create view | 只保存sql逻辑 | 可,但是可能无法使用 |
表 | create table | 保存数据 | 可 |