@一贤不穿小鞋
1.事务的作用:保证数据的安全性.
2.事务:是数据库的最小执行单元,事务将一条或多条sql语句当作一个整体,要么同时全部执行成功,要么同时全部执行失败.
3.事务的特性(ACID):
- 原子性(Atomicity):事务中sql语句不可再分,且事务中sql语句要么同时执行成功,要么同时执行失败.
- 一致性(Consistency):事务执行之前和执行之后,事务中总数据的状态是不变成的.
- 隔离性(Isolation):事务与事务之间是彼此独立,互不干扰.
- 持久性(Durability):事务一但提交或回滚对数据库的修改是永久的.
4.事务的常用方法
- 默认情况下,一条sql语句一个事务,是自动开启的.
4.1:开启事务:start transaction;
4.2:提交事务:commit transaction;
4.3:回滚事务:rollback;
4.4:(了解)设置保存点:savepoint 保存点的名称;
4.5:(了解)回滚到保存点:rollback to 保存点的名称;
eg:#开启事务
START TRANSACTION;
update t_bank set money=money+200 where account=1;
update t_bank set money=money-200 where account=2;
#设置保存点
SAVEPOINT a;
insert into t_bank(account,password,user,money)
values(3,default,'老王',1000);
#回滚到保存点,保存点之后的sql语句撤消了,保存点之前的语句还没处理
ROLLBACK TO a;
#回滚
ROLLBACK;
#提交
COMMIT;
5.(扩展)事务隔离错误:站在事务的角度来说是错误的,但是站在程序的角度来说,有的数据没有问题.
- 脏数据:不正确的数据,读到别还未提交的数据.
5.1:脏读:一个线程中事务读取另一个线程中还没提交的数据叫脏读.
5.2:不可重复读:一个线程中事务读取另一个线程中刚提交修改的数据.
5.3:幻读(虚读):一个线程中事务读取另一个线程中刚提交新增的数据.
7.事务隔离级别:安全性越高,执行效率越低,安全性越低,执行效率越高.
7.1:READ UNCOMMITTED 脏读、不可重复读、虚读有可能发生。
7.2:READ COMMITTED 避免脏读的发生,不可重复读、虚读有可能发生。
7.3:REPEATABLE READ 避免脏读、不可重复读的发生,虚读有可能发生。
7.4:SERIALIZABLE 避免脏读、不可重复读、虚读的发生。
- Oracle数据库默认采用READ COMMITTED隔离级别.
- MySql数据库默认采用REPEATABLE READ 隔离级别.
7.5:查询数据库隔离级别:select @@tx_isolation;//查看当前的隔离级别
- 设置事务的隔离级别:set global/session transaction isolation level 级别;
- //设置当前的事务隔离级别(注意每次修改事务隔离级别后,要重新连接登录数据库,才能生效)
eg:#查看事务隔离级别
select @@tx_isolation;
#修改事务隔离级别
set GLOBAL TRANSACTION isolation LEVEL REPEATABLE READ;
#开启事务
start TRANSACTION;
update t_bank set money=money-200 where account=1;
insert into t_bank(account,password,user,money)
values(3,default,'老王',1000);
#回滚事务
ROLLBACK;
#提交事务
COMMIT;
1.视图:是一张根据原来的一张或多张表中列产生的虚拟表.
2.视图的作用
2.1:使操作简单
- 可以为复杂并且使用频繁的查询定义一个视图,简化查询的步骤。
2.2:增加数据的安全性
- 通过视图,用户只能查询和修改指定的数据,指定数据以外的信息,用户根本接触不到,这样可以保证敏感信息不会被没有权限的人看到。
2.3、提高表的独立性
- 视图可以屏蔽原有表结构变化所带来的影响,例如原来表删除或者增加了某些列,对视图不会照成影响。
3.视图的使用
3.1:创建视图的语法:create view 视图名 as 查询语句;
3.2:修改视图的语法:create or replace view 视图名 as 查询语句
3.3:查看视图:select */列名列表 from 视图名
3.4:删除视图:drop view 视图名.
eg:#创建或修改视图
create or REPLACE view v_stu
AS
select sid,sname,ssex,sage,saddress,cname
from t_student s
inner join t_class c on s.cid=c.cid;
#查看视图
select * from v_stu;
#删除视图
drop view v_stu;