zoukankan      html  css  js  c++  java
  • Mysql的InnoDB和MyISAM的锁模块

    两种引擎关于锁方面的区别:

      1、MyISAM默认是表级锁不支持行集锁。

      2、InnoDB默认用的是行级锁也支持表级锁。

    MyISAM总结:上了共享锁之后依然支持上共享锁,不支持上排他锁。先上排他锁,读或者写都是不允许的,这种特性也同样适用InnoDB引擎。

    InnoDB:在sql没有用到索引的时候用的是表级锁,而sql用了索引的时候就会使用行级锁或GAP(普通非唯一索引用到的),

    两种引擎的场景:

      MyISAM:频繁使用count统计总条数;对数据增删改的频率不高,查询较多的场景;没有事务的系统。

      InnoDB:增删改查都非常频繁的表;可考性要求比较高,要求支持事务的系统。

    数据库的锁分类:

      按照锁的粒度:表级锁,行级锁,页级锁。

      按锁级别划分:共享锁、排他锁。

      按加锁方式划分:自动锁,显式锁。

      按操作划分:DML锁,DDL锁。

      按使用方式划分:乐观锁(数据版本实现)、悲观锁(事务实现)。

    当前读和快照读:

      当前读:select ... lock in share mode,select ... for update,update,delete,insert

      快照读:不加锁的select(事务隔离级别为非串行化才成立,否则快照读会退化成当前读)。 

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

      表象:快照读(非阻塞读),伪MVCC

      内在:next-key锁,行锁+Gap锁

    RC和RR级别下的非阻塞读(快照读)如何实现:

      数据行里的这些字段控制:DB_TRX_ID,DB_ROLL_PTR,DB_ROW_ID。

      undo记录

      read view

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

      case 1: 如果where条件全部命中,只会加记录锁,不会加Gap锁。

      case 2:如果where条件的部分命中命中或全部不命中,则会加Gap锁。

      case 3:Gap锁会用在非唯一索引或不走索引的当前读中。

  • 相关阅读:
    poj2631 Roads in the North(求树的直径)
    P3809 【模板】后缀排序
    P3376 【模板】网络最大流dinic算法
    3224: Tyvj 1728 普通平衡树
    034 Android IntentService 的使用
    033 Android 绑定Service并与之通信
    032 Android Service
    031 Android 异步任务(AsyncTask)
    030 Android 线程+Handler的使用
    029 Android WebView的使用(用来显示网页)
  • 原文地址:https://www.cnblogs.com/niuyg928/p/15150311.html
Copyright © 2011-2022 走看看