事务:
一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位,事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性。
四大特性:
原子性:整个数据库事务是不可分割的单位;
一致性:事务必须使数据库从一个一致性状态变换到另一个一致性状态。在事务开始之前和结束之后,事务的完整性约束没有被破坏;
隔离性:一个事务的影响在该事务提交前对其他事务都不可见;
持久性:事务一旦提交,其结果就是永久性的。
事务的创建:
隐式事务:事务没有明显的开启和结束的标记
比如insert、update、delete语句
显式事务:事务具有明显的开启和结束的标记。如用begin transaction明确指定事务。
前提:必须先设置自动提交功能为禁用
步骤1:开启事务
set autocommit=0;
start transaction; (可选的)
步骤2:编写事务中的sql语句(select、insert、update、delete)
步骤3:结束事务
commit; 提交事务
rollback; 回滚事务
回滚到指定的地方:rollback to 回滚点名;
savepoint 结点名; 设置保存点
例:
set autocommit=0;
start transaction;
delete from account where id = 25;
savepoint a; #设置保存点
delete from account where id = 27;
rollback to a; #回滚到保存点(27未被删除)
并发事务
1.事务的并发问题是如何发生的?
多个事务同时操作同一个数据库的相同数据时
2.并发的问题都有哪些?
脏读:一个事务读取了其他事务还没有提交的数据,读到的是其他事务“更新”的数据;(重点是修改,如多次读取一条记录发现其中某些列的值被修改)
不可重复读:一个事务多次读取,结果不一样;
幻读:一个事务读取了其他事务还没有提交的数据,只是读到的是其他事务“插入”的数据;(重点是新增或删除,如多次读取一条记录发现记录增多或减少了)
3.如何解决并发问题
通过设置隔离级别来解决并发问题
事务的隔离级别:
脏读 不可重复读 幻读
Read uncommitted:读未提交 √(会发生) √ √
Read committed: 读已提交 ×(不会) √ √
Repeatable read: 可重复读 × × √
Serializable:可串行化 × × ×
Mysql中默认第三个隔离级别 Repeatable read
Oracle中默认第二个隔离级别 Read committed
查看隔离级别
select @@tx_isolation;
设置隔离级别
set session|global transaction isolation level 隔离级别;
视图
含义:虚拟表,和普通表一样使用
应用场景:①多个地方用到同样的查询结果 ②该查询结果使用的sql语句较复杂
好处:①重用了sql语句 ②简化复杂的sql操作,不必知道它的查询细节 ③保护数据,提高安全性
创建语法的关键字 是否实际占用物理空间 使用
视图 create view 占用较小,只保存sql逻辑 一般用于查询
表 create table 保存实际的数据 增删改查
- 创建视图
语法:
create view 视图名
as
查询语句;
例:查询平均工资最低的部门信息
#创建视图
create view myv
as
select avg(salary) ag, department_id
from employees
group by department_id;
#使用视图查看工资
select * from myv order by ag limit 1;
- 视图的修改
方式一:
create or replace view 视图名
as
查询语句;
方式二:
alter view 视图名
as
查询语句;
三、删除视图
语法:drop view 视图名,视图名,...;
四、查看视图
desc 视图名;
show create view 视图名;
五、视图的更新
1、插入
insert into myv values(‘张飞’, ‘19’);
2、修改
update myv set lastname = ‘小张’ where lastname=’张飞’;
3、删除
delete from myv where lastname=’小张’;
具备以下特点的视图不允许更新
①包含以下关键字的sql语句:分组函数、distinct、group、by、having、union或union all;
②常量视图;
③select中包含子查询
④join (不允许插入)
⑤from一个不能更新的视图
⑥where子句的子查询引用了from子句中的表