数据库05_事务处理

事务


1.概念

事务是用户定义的一个数据库操作序列,这些操作要么全做,要么不做。在关系数据库中,一个事务是一条SQL语句、一组SQL语句或者整个程序。


2.ACID特性

事务具有以下4个特性:

  • 原子性:一个事务中的所有操作,要么全部完成,要么全部不做。
  • 一致性:在事务开始之前或者完成之后,数据库的完整性都没有被破坏。如果事务被迫中断,逻辑上就会发生错误,数据库就处于不一致状态。
  • 隔离性:防止多个事务并发执行由于交叉执行导致数据不一致。
  • 持久性:事务一旦提交,他对数据库的改变应该是永久性的,即使系统故障也不会丢失。

3.MySQL事务

MySQL命令行默认自动提交事务,显式开启事务使用BEGIN或者START TRANSACTION或者执行SET AUTOCOMMIT=0禁止当前会话的自动提交。
事务控制语句有:

  • BEGIN或者START TRANSACTION:显式开启一个事务
  • COMMIT:提交事务到数据库
  • ROLLBACK:结束用户的事务,并撤销正在进行的所有未提交的修改

数据库恢复


1.故障分类

数据库系统可能会发生各种故障;

  • 事务内部故障
  • 系统故障
  • 介质故障
  • 计算机病毒

2.恢复技术

  • 数据转储
  • 登记日志文件

数据库并发控制

为了保证事务的隔离性和一致性,数据库管理系统需要对并发操作进行正确的调度。


1.数据不一致性

  • 丢失修改:两个事务修改同一数据,其中一个事务破坏了另一个事务的修改。
  • 不可重复读:一个事务读取数据,另一个事务更新数据,导致第一个事务无法再现前一次读的数据。
  • 读脏数据:一个事务修改数据并写回磁盘,另一个事务读取数据;第一个事务由于其他原因被撤销,导致第二个事务读到的数据与数据库中的数据不一致。

产生上述不一致性的原因是并发操作破坏了事务的隔离性,并发控制就是为了保证隔离性,从而避免数据的不一致性。


2.并发控制技术

主要技术有:

  • 封锁
  • 时间戳
  • 乐观控制法
  • 多版本并发控制

这里主要解释封锁技术,基本的封锁分为排他锁(写锁、X锁)和共享锁(读锁、S锁)。封锁协议如下:

  • 一级封锁协议
    • 事务在修改数据前必须先加X锁,直到事务结束(COMMIT或者ROLLBACK)才释放。
    • 防止丢失修改
  • 二级封锁协议
    • 在一级封锁协议的基础上增加事务读取数据前先加S锁,读完立即释放S锁。
    • 防止丢失修改,防止读脏数据
  • 三级封锁协议
    • 在一级封锁协议的基础上增加事务读取数据前先加S锁,直到事务结束才释放。
    • 防止丢失修改,防止读脏数据,防止不可重复读

数据库的锁机制

推荐文章:https://www.cnblogs.com/ggjucheng/archive/2012/11/14/2770445.html#top
为了保证数据库的完整性和一致性,数据库系统采用锁来实现事务的隔离性。
根据锁的对象分为表级锁(并发少,以查询为主)和行级锁(并发高)。根据锁的类型分为以下几种:


1.悲观锁

悲观地认为并发总会产生问题,所以在事务开始读取数据时就对数据加锁,直到事务提交或者回滚才允许其他事务读取数据。

  • 共享锁
    • 用于读取数据,允许其他事务读取它锁定地资源,但是不允许其他事务修改
    • 事务执行select语句时,使用共享锁锁定要查询的数据
    • 具有良好的并发性能,数据被加共享锁后,还可以加共享锁或更新锁
  • 独占锁
    • 用于修改数据,不允许其他事务读取或者修改它锁定的资源
    • 事务执行insert、update、delete语句时,使用独占锁锁定数据
    • 并发性能差,只能允许一个事务进行读取和修改,其他事务需要等待该事务结束才能加其他锁
  • 更新锁
    • 用于锁定将要被修改的数据
    • 事务执行update语句时,数据库系统先分配更新锁,读取完数据后再升级为独占锁进行修改。(如果先分配共享锁,读取完再升级为独占锁,有可能产生死锁 -> 两个事务都等待另一个事务释放共享锁)
    • 允许在更新锁上加共享锁,但是一个资源最多加一个更新锁,然后升级为独占锁,避免死锁

2.乐观锁

乐观地认为并发不一定会产生问题,所以在事务处理完数据提交时才检查数据是否被修改过,如果修改过,则更新失败。
乐观锁与数据库锁机制无关,其实现策略为:

  • 设置版本字段:事务更新后其值加一,每当事务提交时检查其值与更新前是否一致
  • 添加时间戳字段(timestamp类型):每当事务提交时检查和更新前的时间戳是否一致

数据库索引

1.索引实现原理

  • 数据库索引是数据库管理系统中的一个排序的数据结构(通常是B树或者B+树),以实现快速查找数据。
  • 在表的某一列上创建索引,即将这一列的数据复制出来,生成非聚集索引(平衡树)。当按某个值查找时,先从非聚集索引中查找此值对应的主键,然后在按照主键值在聚集索引中查找数据。(或者在复合索引中直接查找到需要的数据)
  • 在表中添加主键,则表在磁盘中的存储结构由整齐排列变为平衡树结构,整个表也就变成了聚集索引。所以一个表只能有一个主键,一个聚集索引。

2.设置索引代价

设置索引会占用物理空间,在插入和修改数据时维护索引也需要花费较多时间。

posted @ 2018-10-26 11:02  bkycrab  阅读(139)  评论(0编辑  收藏  举报