事物管理与存储过程

目标:
1.了解事物的概念,会开启、提交和回滚事务
2.掌握事物的4种隔离级别
3.学会创建存储过程
4.学会调用、查看、修改和删除存储过程

事务管理

1. 什么是事务(一条或多条SQL语句)
所谓的事物就是针对数据库的一组操作,可以是一条或者多条SQL语句组成,同一个事务具有同步的特点,如果其中一条无法执行,那么所有的语句就都不会执行。
2. 事务的4个特性(原子性、一致性、隔离性、持久性)

  1. 原子性: 原子性是事务必须被看成是一个不可分割的最小单元,只有事务中所有的数据库操作都执行成功,才算整个事务执行成功。如果有一个事务中任何一个SQL语句执行失败,已经成功执行的SQL语句也必须撤销。
  2. 一致性: 一致性是指事务将数据库从一种状态转变为下一种一致的状态。比如,在表中姓名字段具有唯一约束,如果一个事务对姓名字段更改,使姓名不唯一,这就破坏了事务的一致性。如果事务中某个动作失败,系统可以自动撤销事务,返回初始化状态。
  3. 隔离性: 隔离性还可以称为并发控制、可串行化、锁等,当多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发之间要相互隔离。
  4. 持久性: 事务一旦提交,其所做的修改就会永久保存到数据库中,即使数据库发生故障也不应该对其有任何影响。

3.事务隔离问题
脏读:读取另一个事务未提交的数据

a账户给b账户转账100元买东西,a账户开启了一个事物,但不提交,b的隔离级别较低,读到a中未提交的事物,发现已经收到a的转账,发货给a,b发货成功后,a将事物回滚。此时b受到损失,这就是脏读。

不可重复读:事务中两次查询的结果不一致

第一次查询a账户有1000元,第二次查询b账户有900元,原因是统计期间a账户取出了100,导致多次统计报表的结果不一致。

幻读(虚读): 一个事务内两次查询中数据条数不一致

事物内两次查询中数据条数不一致,幻读和不可重复读有些类似,同样是在两次查询过程中,不同的是,幻读是由于其他事物做了插入记录的操作,导致记录数有所增加

可串行化:它在每个读的数据行上加上锁,使之不可以相互冲突,因此会产生大量的超时现象

最高隔离级别,它在每个读的数据行上加上锁,使之不可能相互冲突,因此会导致大量超时的现象

4.事务的隔离级别(读未提交、读提交、可重复读、可串形化)

  1. 读未提交(READ UNCOMMITTED)
    脏读:事物可以读到另一个事物中未提交的数据

事务中最低的级别,该级别下的事务可以读取到另一个事务中未提交的数据,也被称为脏读。由于该级别低,实际开发中一般很少用。

  1. 读提交(READ COMMITTED)(Oracle默认级别)
    重复读:事务内重复读取了别人线程已经提交的数据,但两次结果不一致,原因是查询的过程中其他事务做了更新操作。
    幻读:事务内两次查询中数据的条数不一样,原因是查询过程中其他的事务做了添加的操作。

该级别下的事务只能读取其他事务已经提交的内容,可以避免脏读,但不能避免重复读和幻读的情况。

  1. 重复读(REPEATABLE READ)(Mysql默认级别)
    它可以避免脏读,不可重复读的问题,确保同一事务的多个实例在并发读数据时,会看到同样的数据行。但理论上,该级别会出现幻读的情况,不过Mysql的存储引擎通过多版本并发控制机制解决了该问题。
  2. 可串行化(SERIALIZABLE)

它会强制对事务进行排序,使之不会发生冲突,从而解决脏读,幻读,重复读的问题。实际上,是在每个读的数据行加锁。

5.存储过程的创建

存储过程就是一条或多条SQL语句的集合,当对数据库进行一系列复杂操作时,存储过程可以将这些复杂操作封装成一个代码块,以便重复使用,大大减少数据库开发人员的工作量。

6.
7.
8.
9.
10.