• mysql :数据库事务


    innodb锁和事务是区别于myisam
    事务特点acid
    事务并发的问题
    事务隔离级别用来解决事务并发问题
    事务日志redo-log和undo-log
     
     

     
    考察锁的前提是:多个事务并发的访问同一个数据,需要加锁来保证数据库一致性。
     
    ===什么是事务?
    多条数据库操作要么全部执行,要么全部撤销。
     
    ===事务的四个特性ACID,最重要的是要保证什么?
    A:原子性,保证事务的多个操作是一个不可分割的原子操作。要么全部执行要么全部撤销。通过事务回滚和undo-log以及MVCC多版本控制来保证原子性
    C:一致性。事务操作之后保证数据不被破坏,保证数据库一直处于一致性的状态。
    i:隔离性。多个并发的事务之间互相不干扰。
    d:持久性:事务提交之后要持久化到数据库中。mysql通过redo-log去记录每个提交的事务并且持久化到磁盘中。
    目的:最重要的是保证数据一致性。
     
    ===事务并发可能出现的问题?读数据问题和写数据问题分类?
    并发问题发生就是因为没有给数据访问上锁导致的,就是读写操作并行执行导致的问题,同时也是事务没做同步会出现的问题。
    -----读数据问题:三种,脏读,不可重复读和幻读
    脏读:读取的数据是脏的,其实就是a事务读取到b事务未提交的更改数据。a事务读取b事务修改后未提交的数据,a事务提交,b事务回滚,说明a事务读取到了无效的数据。
    不可重复读:a事务读取到b事务提交的更改数据。意思是a事务重复读数据会出错,比如A事务前后读同一个数据的时候,B事务恰好修改数据,那么A重复读取的数据就会前后不一致就会出错。这里重点在这个数据是更改或者删除的数据,所以必须加上行级锁。
    幻读:a事务读取到b事务提交的新增数据。这个时候加表级锁防止新增数据。
    -----两种更新操作问题:丢失更新问题
    a事务覆盖了b事务的更新
    第一类数据丢失:
    a事务回滚,导致b事务提交的更新数据丢失。
    第二类数据丢失:
    a事务提交,导致b事务提交的更新被覆盖。
     
    ===事务隔离级别
    为了解决事务并发条件下的问题,使用一定的事务隔离级别去处理。
    四种隔离级别,隔离级别越高,能够避免的并发读问题就越多,并发能力就越弱。
      现在来看看MySQL数据库为我们提供的四种隔离级别:
      ① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。说明a事务读的时候 ,b事务不能改不能插入新的数据。
      ② Repeatable read (可重复读):可避免脏读、不可重复读的发生。a事务读的时候,b事务不能改,可以新增。因为无法避免幻读,说明可以新增产生幻读。
      ③ Read committed (读已提交):可避免脏读的发生。a事务读的时候,b事务可以改可以新增。
      ④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。
     
     
    ======================================================================
    事务:mysql技术内幕
    ===事务的分类
    扁平化事务:最一般最常用的事务,事务中的所有操作都是平
    带保存点的扁平化事务
    链接事务:只能回滚当前事务
    嵌套事务:父事务提交子事务才能提交,父事务回滚子事务才能够回滚,加锁的时候存在父子共享锁。
    分布式事务
     
    ===innodb的redo-log,事务是如何被持久化的呢?
    事务提交的时候会被写到一个叫redo-log的日志缓冲文件中,并按照一定策略同步到磁盘,这就是事务持久化。
    日志从:线程---重做日志文件缓冲---fsync写入磁盘
    innodb_flush_log_at_trx_commit这个参数代表了刷新策略。
    0---事务提交的时候不写入log,每秒直接从线程写到磁盘
    1---事务提交commit写入log,并且从log写道磁盘
    2---事务提交的时候写入到log,不进行fsync
     
     
    ===undo区域实现的功能,什么是MVCC
    undo-log:实现事务回滚和mvcc
    MVCC:多版本控制。使用undo区域实现非锁定一致性读,当某些数据被事务锁定的时候,其他事务可以进行非锁定一致性读操作,读取undo区域中的快照数据。
     
    ===某个事务回滚的时候当前数据页可能变化?将一个update操作进行回滚的时候数据库中具体是什么样的实现呢?
    因为某个数据页上同时可能有数千个并发的事务在处理,所以不可能将该页面完全回滚到事务开始时候的样子,这样会影响其他的事务。
    事务回滚其实本质上做相反的操作,比如说insert 10w条数据的时候,这个事务确实会分配表空间,这个是不可逆的。每个insert操作会有delete操作作用在上面,每个update会有相反的update作用。
     
    ===innodb默认使用的隔离级别?在这个隔离级别下innodb如何解决幻读的问题呢?innodb什么时候会使用到serializable的隔离级别呢?
    默认使用repeatable read可重复读
    使用next-key lock来解决幻读的问题
    在分布式事务条件下会使用serializable事务级别。
     
     
     
     
     
     
     
  • 相关阅读:
    【Mysql】Mysql常见的日志种类及作用
    【Mysql】执行sql的过程
    【Mysql】回表查询原理,利用联合索引实现索引覆盖
    【Mysql】explain详解与索引最佳实践
    【Mybatis】MyBatis源码编译
    【Mysql】MySQL数据存储文件详解
    【LoadRunner-工作原理】
    【LoadRunner-简介】
    【LoadRunner-基础篇】
    【LoadRunner-基础篇】
  • 原文地址:https://www.cnblogs.com/buptyuhanwen/p/9303440.html
Copyright © 2020-2023  润新知