zoukankan      html  css  js  c++  java
  • mysql 事务

    事务 要么全部成功,要么全部失败

    遵循ACID 原则

    原子性

    一致性

    隔离性

    持久性

    MySQL的隔离级别 

    1,RU 读未提交 可以读取未提交的数据

    2,rc 读提交  只能读取已经提交的数据  一般开发设置

    3,rr 可重复读  一个事务中,重复读取数据一致,无论其他事务中是否对当前数据做了修改

    4,serializable 读写都会加锁

    隔离级别脏读不可重复读幻影读
    READ-UNCOMMITTED
    READ-COMMITTED ×
    REPEATABLE-READ × ×
    SERIALIZABLE × × ×

     

    脏读 读取到未提交的数据

    不可重复读 每次读取的数据都不一致, 强调的是修改

    幻读 同一事务查询中,两次查询到的数据条数不一致。因其他事务增删导致   强调的是增删

    MySQL事务的实现

    A 原子性 主要是通过undo Log(回滚日志)实现。当事务回滚时能够撤销所有已经成功执行的sql语句。

    innoDB实现回滚,靠的是undo log,当事务对数据进行修改时,innoDB会生成对应的undo log;如果事务执行失败或调用了rollback,

    导致事务需要回滚。便可以利用undo log中的信息将数据回滚到修改之前的样子。

    C 持久性 通过redolog 实现。MySQL的更新操作都是先写到buffer pool中的,然后再刷新到硬盘中的。

    如果宕机的话,buffer pool数据被清空,则可能导致数据丢失。

    二阶段提交提交,数据更新在写到buffer pool之前先记录redo log(WAL)。这样在buffer pool数据丢失的时候可以通过redo log获取到更新的内容。

    redo log的数据也需要写到磁盘中

    为什么redo log 写入磁盘比buffer pool快。redo log是顺序写入的。buffer pool 刷盘的话是以页为单位(默认16k)进行刷盘的。redo log只包含真正需要写入的部分。内容少于buffer pool刷盘

    I 隔离性  专注于不同事务之间的影响

    写与写之间的隔离 锁来保证

    写与读之间的隔离 MVCC保证

    D 一致性  数据在事务执行前后都是合法的数据状态

    依赖于ACI的实现基础

     

     

     

  • 相关阅读:
    3.23.谷歌中国搜索关闭的日子
    在Fedora下成功将Vim打造成适用于C/C++的IDE
    有关内存DC和双缓冲位图的问题汇总
    [转]阶乘 n! 末尾 0 的个数
    [转]各种排序算法
    [转]使用CEGUI的Editbox进行中文输入
    [转]ASP.NET中文件上传下载方法集合
    背包问题的c++解法
    [转]经典C/C++算法
    [转]编写自己的MSN机器人
  • 原文地址:https://www.cnblogs.com/luoying/p/14601895.html
Copyright © 2011-2022 走看看