zoukankan      html  css  js  c++  java
  • MyISAM、InnoDB 数据锁、事务隔离级别

    MyISAM与InnoDB关于锁方面的区别是什么

    • MyISAM默认用的是表级锁,不支持行级锁
    1. lock tables table_name read | write; myisam加锁
    2. unlock tables;
    3. select * from table_name for update;读锁上排它锁
    • InnoDB默认用的是行级锁,也支持表级锁
    1. show variables like 'autocommit';  set autocommit = 0; #关闭自动提交
    2. select * from table_name where id = ? lock in share mode; 为查询语句加锁

    MyISAM使用场景

    • 频繁执行全表count语句
    • 对数据进行增删改的频率不高,查询非常频繁
    • 没有事务

    InnoDB适合的场景

    • 数据增删改查都相当频繁
    • 可靠性要求比较高,要求支持事务

    数据库锁的分类

    • 按锁的粒度划分,可分为表级锁、行级锁、页级锁
    • 按锁级别划分,可分为共享锁、排它锁
    • 按加锁方式划分、可分为自动锁、显式锁
    • 按操作划分,可分为DML锁,DDL锁
    • 按使用方式划分,乐观锁,悲观锁

    数据事务的四大特性

    ACID

    • 原子性(Atomic)
    • 一致性(Consistency)
    • 隔离性(Isolation)
    • 持久性(Durability)

    事务并发访问引起的问题以及如何避免

    • 更新丢失--mysql所有事务隔离级别在数据库层面均可避免
    • 脏读--READ-COMMITTED事务隔离级别以上可以避免
    • 不可重复读--REPEATABLE-READ事务隔离级别以上可避免
    • 幻读--SERIALIZABLE事务隔离级别可避免(事务A读取与搜索条件匹配的若干行,事务B以插入或删除行的方式修改事务A的结果集,导致事务A像出现幻觉一样)

    InnoDB可重复读隔离级别下如何避免幻读

    • 表象:快照读(非阻塞读)--伪MVCC
    • 内在:next-key锁(行锁+gap锁)

    当前读和快照读

    • 当前读:select ... lock in share mode, select ... for update
    • 当前读:update, delete, insert(读取记录的最新版本,还要求其他事务不能修改当前记录)
    • 快照读:不加锁的非阻塞读,select

    show variables like 'autocommit';#查看当前事务是否是自定提交

    SET autocommit = 0;#关闭自动提交

    select @@tx_isolation;#查看事务的隔离级别

     RC、RR级别下的InnoDB的非阻塞读如何实现

    • 数据行里的DB_TRX_ID、DB_ROLL_PTR、DB_ROW_ID字段
    • undo日志
    • read view

    next-key锁(行锁+gap锁)

    对主键索引或唯一索引会用Gap锁吗

    •  如果where条件全部命中,则不会用Gap锁,只会加记录锁
    • 如果where条件部分命中或全不命中,则会加Gap锁

    Gap锁会用在非唯一索引或者不走索引的当前读中

  • 相关阅读:
    算法
    日常
    算法
    算法
    算法
    算法
    NaviCat连接mysql出现加密方式错误的解决方案:
    Sql sugar的使用
    报表体联查详情页面
    第一次用临时表的感受:
  • 原文地址:https://www.cnblogs.com/2661314cn/p/13557287.html
Copyright © 2011-2022 走看看