zoukankan      html  css  js  c++  java
  • Mysql锁机制--概念、分类及基础命令

    Mysql 系列文章主页 

    ===============

    1 概念

    在 Java 程序中,当多线程并发访问某个资源的时候,如果有非线程安全的操作,那么需要通过加锁来保护之。同理,在 Mysql 中,如果也有多个线程、多个事务并发访问某些资源(比如写同一行记录)时,也需要锁来保护,以确保数据的正确性。

    2 分类

    从对数据的操作类型来分:

    • 读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会互相影响
    • 写锁(排它锁):当前写操作没有完成前,会阻塞其它写和读操作

    从对数据操作的粒度分:

    • 表锁:偏向 MyISam 引擎,开销小,加锁快;无死锁;锁定粒度大,锁冲突概率最高、并发度最低
    • 行锁:偏向 InnoDB 存储引擎,开销大,加锁慢;会出现死锁;锁定粒度小,锁冲突概率最低、并发度最高

    3 基础命令

    3.1 查看当前系统中,每个表被锁与否:

    SHOW OPEN TABLES;

    目前所有的 In_use 都是0,说明没有表被锁。 

    3.2 给 Employee 表加上读锁:

    LOCK TABLE employee READ;

    3.3 给 Department 表加上写锁:

    LOCK TABLE department WRITE;

    或者,3.2 和 3.3 的命令写在一起,像这样:

    LOCK TABLE employee READ, department WRITE;

    3.4 再用 SHOW OPEN TABLES 来看看

    SHOW OPEN TABLES;

    可以看到,Employee 及 Department 表已经被锁住(In_use=1)。

    3.5 解锁:

    UNLOCK TABLES;

     现在,所有表都没有被加锁。

    3.6 查看系统上的表锁定信息

    SHOW STATUS LIKE 'table%';

    这个【Table_locks_waited】值比较重要,值越大说明等待锁的次数越多、竞争越大。

    3.7 查看当前数据库的隔离级别

    SHOW VARIABLES LIKE 'tx_isolation';

    这是Mysql默认的隔离级别

    3.8 InnoDB 引擎查看锁状态

    SHOW STATUS LIKE '%innodb_row_lock%';

    等待平均时长、等待总时长、等待总次数,这三项比较重要。

  • 相关阅读:
    [JSOI2007][BZOJ1031] 字符加密Cipher|后缀数组
    leetcode Flatten Binary Tree to Linked List
    leetcode Pascal's Triangle
    leetcode Triangle
    leetcode Valid Palindrome
    leetcode Word Ladder
    leetcode Longest Consecutive Sequence
    leetcode Sum Root to Leaf Numbers
    leetcode Clone Graph
    leetcode Evaluate Reverse Polish Notation
  • 原文地址:https://www.cnblogs.com/cyhbyw/p/8861363.html
Copyright © 2011-2022 走看看