数据库基础——事务

来源:互联网 发布:淘宝上卖医疗器械 编辑:程序博客网 时间:2024/05/19 02:05

一、事务

  所谓事务,是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。
  例如,关系数据库中,一个事务可以是一条SQL语句、一组SQL语句或者整个程序。
  事务和程序是两个概念,一般来说,一个程序中包含多个事务。

二、事务的特性

  事务具有四个特性:原子性、一致性、隔离性、持久性。四个特性简称为ACID特性。
  1. 原子性:
    事务是数据库逻辑工作单位,事务中包括的诸多操作,要么全做,要么全不做。
  2. 一致性:
    事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统运行中发送故障,有些事务尚未完成就被迫中断,这些未完成的事务对数据库所做的修改有一部分已经写入物理数据库,这时,数据库就处于一种不正确的状态,或者说不一致的状态。
  3. 隔离性:
    一个事务的执行,不能被其他事务干扰。即一个事务的内部操作及试用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能相互干扰。
  4.持久性:
    持久性也称为永久性,指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或者故障不应该对其执行结果有任何影响。
  事务是恢复和并发控制的基本单位。
  保证事务的ACID特性是事务管理的重要任务,事务ACID特性可能遭到破坏的因素有:
  (1)多个事务并行运行时,不同事务的操作交叉执行。
  (2)事务在运行过程中被强行停止。
  在第一种情况下,数据库管理系统必须保证多个事务的交叉运行不影响这些事务的原子性。第二种情况下,数据库管理系统必须保证被强行终止的事务对数据库和其他事务没有任何影响。
  

三、并发控制

  为了保证事务的隔离性和一致性,DBMS需要对并发操作进行正确调度。其中并发操作带来的数据不一致性主要包括:丢失修改、不可重复读和读“脏数据”
  1、丢失修改
  两个事务T1和T2读入同一条数据并修改,T2提交的结果破坏了T1提交的结果,导致T1的修改被丢失。
  
  2、不可重复读
  不可重复读是指事务T1读取数据后,事务T2对该数据进行了更新操作,导致后续T1无法再现前一次读取的结果,具体包括三种情况:
  (1)事务T1读取某一数据后,事务T2对其做了修改,当T1再次读取该数据时,得到的数据与前一次不一致。
  (2)事务T1按一定条件从数据库中读取了某些数据记录后,事务T2删除了其中部分记录,当T1再次按相同条件读取数据时,发现某些记录神秘消失。
  (3)事务T1按一定条件从数据库中读取了某些数据记录后,事务T2插入了一些记录,当T1再次按相同条件读取数据时,发现多了一些记录。
  后两种不可重复读的情况,有时也称为幻读。
  
  3、读“脏数据”
  读“脏数据”是指事务T1修改了某一数据,并写回磁盘,T2读取统一数据后,T1由于某种原因被撤销,这时T1已修改过的数据恢复为初始值,而T2读到的数据就与数据库中的数据不一致,,则T2读到的数据就是“脏数据”。
  

四、封锁

  并发控制的主要技术之一就是封锁。所谓封锁,就是事务T在对某个数据对象例如表、记录等操作之前,先向系统发出请求,对其加锁,加锁之后,事务T就堆该数据对象有了一定的控制,在事务T释放它的锁之前,其他的事务不能更新此数据对象。
  基本的封锁类型:排它锁(X锁)和共享锁(S锁)
  排它锁:称为写锁,若事务T对数据对象加上X锁,则只允许T读取和修改该数据对象。其他事务不能再在该数据对象上加锁。
  共享锁:称为读锁,若事务T对数据对象加上S锁,则事务T可以读取但不能修改该数据对象,但其他事务仍然可以加S锁到该数据对象上。