zoukankan      html  css  js  c++  java
  • innoDB存储引擎如何保证事务的ACID

    innodb事务的ACID:
    隔离性, 原子性, 一致性,持久性
    1, 锁实现隔离性
    2, redo log保证事务的原子性和持久性
    3, undo log 保证事物的一致性

    force log at commit
    innodb_flush_log_at_trx_commit: 控制redo log buffer刷新到磁盘的策略
    =0 表示事务提交时不进行写入redo log操作,这个操作只在master thread完成,而在master thread中每1秒进行一次redo log文件的fsync操作
    =1 (默认值) 事务提交时,必须调用一次fsync操作
    =2 事务提交时,redo log buffer会写入到操作系统缓存中,但是不进行fsync操作

    二、事务的并发问题

      1、脏读:事务A读取了会话B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

      2、不可重复读:会话 A 两次查询数据,查询记录数是一样的,但是记录本身不一样,会话 B再两次查询中间执行了update并提交了。

      3、幻读:会话 A 两次查询数据,查询记录数不一样,会话 B在会话A两次查询中间执行了insert,delete并提交了

      小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表

     三,MySQL事务隔离级别

    事务隔离级别 脏读 不可重复读 幻读
    读未提交(read-uncommitted)
    读已提交(read-committed)
    可重复读(repeatable-read) 否 
    串行化(serializable)
    # 设置事务隔离级别
     set session transaction isolation level read committed;
    
    # 查看事务隔离级别
    # v5.7及以前
    select @@tx_isolation;
    # v8.0及以后
    select @@transaction_isolation;
  • 相关阅读:
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
    @RequestParam设置默认可以传空值
    python清空列表的方法
    Git分支管理的基本操作
    判断一个坐标点是否在不规则多边形内部的算法
    Flask 解析 Web 端 请求 数组
    SQL server 获取异常
    SQL server 大量数据导入和系统运行慢的问题
    SQL SERVER 跨服务器连接
    #pragma once
  • 原文地址:https://www.cnblogs.com/alenblue/p/13236115.html
Copyright © 2011-2022 走看看