zoukankan      html  css  js  c++  java
  • 数据库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.设置索引代价

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

  • 相关阅读:
    poj 3528 (三维几何求凸包+凸包表面积)
    dijkstra模板(好像是斐波那契额堆优化,但我为什么看起来像优先队列优化,和spfa一样)
    最大空凸包模板
    ICPC 2017–2018, NEERC, Northern Subregional Contest St Petersburg, November 4, 2017 I题
    hdu 5248 序列变换
    hdu 2063(二分图模板测试)
    组合数
    85. Maximal Rectangle 由1拼出的最大矩形
    750. Number Of Corner Rectangles四周是点的矩形个数
    801. Minimum Swaps To Make Sequences Increasing 为使两个数组严格递增,所需要的最小交换次数
  • 原文地址:https://www.cnblogs.com/pycrab/p/9855157.html
Copyright © 2011-2022 走看看