• 数据库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.设置索引代价

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

  • 相关阅读:
    一个苏州IT人的5年挨踢经历经历篇(之二)
    【Java】Collection 集合框架概述
    【Java】Collection子接口:其二 Set 组接口
    【Java】【常用类】Calendar 日历类
    【郝斌C ST】01
    【Java】【常用类】Date 日期类
    【Java】Enumeration Class 枚举类
    【Java】Properties 配置信息类
    【Java】Generic 泛型
    【Java】Annotation 注解
  • 原文地址:https://www.cnblogs.com/pycrab/p/9855157.html
Copyright © 2020-2023  润新知