• 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锁会用在非唯一索引或者不走索引的当前读中

  • 相关阅读:
    JS---案例:大量字符串拼接效果实现
    JS高级---三种创建对象的方式
    松软科技Web课堂:JavaScript HTML DOM 动画
    JS-DOM事件
    JS DOM操作(创建、遍历、获取、操作、删除节点)
    ES6函数的扩展
    月薪20k的web前端开发程序员,他们都会的这6招
    JS高级---识别正则表达式是否匹配
    揭秘webpack plugin
    react-React深入-一等公民-props-onChange
  • 原文地址:https://www.cnblogs.com/2661314cn/p/13557287.html
Copyright © 2020-2023  润新知