事务

一个或一组sql语句组成一个执行单元,要么全部执行,要么全部不执行。

事务的四大特性(ACID)

Actomicity(原子性):表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败。
Consistency(一致性):一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
Isolation(隔离性):一个事务的执行不能被其它事务干扰 比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
Durability(持久性):持久性事务完成后,它对于系统的影响是永久性的

事务的创建

隐式事务:事务没有明显的开启和结束的标记 如:select、insert、update、delete语句
显示事务:事务有明显的开启和结束的标记

  1. //前提是先设置自动提交功能是禁用
  2. set autocommit=0; //只针对当前事务有效
  3. commit; //提交事务
  4. rollback; //回滚事务

事务的隔离级别

同时运行多个事务时,当访问数据库中相同的数据时会导致一些并发问题:
脏读:对于两个事务T1,T2, T1读取了已经被T2更新但还没有被提交的字段.之后,若T2回滚,T1读取的内容就是临时且无效的.
不可重复读:对于两个事务T1,T2, T1读取了一个字段,然后T2更新了该字段.之后, T1再次读取同一个字段,值就不同了.
幻读:对于两个事务T1, T2,T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行.之后,如果T1再次读取同一个表,就会多出几行.

隔离级别 描述
READ UNCOMMITTED
(读未提交数据)
允许事务读取未被其他事务提交的变更.脏读,不可重复读和幻读的问题都会出现
READ COMMITTED
(读已提交数据)
只允许事务读取已经被其它事务提交的变更.可避免脏读,但不可重复读和幻读问题仍可能出现
REPEATABLE READ
(可重复读)
确保事务可以多次从一个字段中读取相同的值.在这个事务持续期间,禁止其他事物
对这个字段进行更新.可以避免脏读和不可重复读, 但幻读的问题仍然存在,
SERIALIZABLE
(串行化)
确保事务可以从一个表中读取相同的行.在这个事务持续期问,禁止其他事务对该表执行插入,更新和删除操作. 所有并发问题都可以避免,但性能十分低下.

Oracle默认:READ COMMITTED
MySQL默认:REPEATABLE READ

  1. //查看事务的隔离级别
  2. select @@transaction_isolation;
  3. //设置事务的隔离级别
  4. SET transaction_isolation = 'READ-UNCOMMITTED';
  5. //设置事务保存点
  6. savepoint 别名; //搭配rollback回滚到事务点

视图

封装了一个临时动态生成的查询结果集的虚表。只保存了sql逻辑,不保存查询结果

  1. #创建
  2. CREATE [OR REPLACE]
  3. [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}]
  4. VIEW 视图名称 [(字段列表)]
  5. AS 查询语句
  6. [WITH [CASCADED|LOCAL] CHECK OPTION]
  7. create view 视图名 [(字段列表)]
  8. as
  9. 查询语句;
  10. eg:
  11. create view my_v1
  12. as
  13. select last_name,salary
  14. from employees
  15. where salary=(
  16. select MIN(salary) from employees
  17. );
  18. select * from my_v1
  19. #视图的修改
  20. create or replace view 视图名
  21. as
  22. 查询语句;
  23. #删除视图
  24. drop view 视图名,视图名,视图名...;

注:基本的视图是不能进行更新操作的。但如果面对简单单表查询的视图,是可以做更新操作并且会修改到原基本表的数据。

  1. eg:
  2. create view my_v1
  3. as
  4. select * from book; //简单查询
  5. insert into my_v1 values("javaee"); //导致原表也跟随修改
  6. 一般很少会简单查询作为视图 所以视图基本认为不能修改