• mysql的锁机制


    MyISAM和MEMORY存储引擎采用的是表级锁,InnoDB存储引擎既支持行级锁又支持表级锁

    一、MyISAM表锁

    MySQL的表级锁有两种模式:表共享读锁和表独占写锁

    1、对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求

      注意:

      ①有两个session,s1和s2,当s1中添加了表共享读锁时,s1会话中也不可以进行新增、修改操作

      ②当s1会话中对某张表上了表共享读锁后,在s1会话中去查未上表共享读锁的表数据会报错

    2、对MyISAM表的写操作,会阻塞其他用户对同一表的读和写操作

    二、InnoDB的行锁模式及加锁方法

    注意:

      InnoDB行锁是通过给索引上的索引项加锁来实现的,若表中无索引,则会进化为表级锁

    1、共享锁:能进行读操作,不能进行写操作

      详细解释:多个事务对于同一数据可以共享一把锁,都能访问到数据库,但是只能读不能修改

       s1、s2两个会话共同操作一张表

      s1:select * from table where id=1 lock in share model;

      s2:select * from table where id=2;  可以正常查询

      s2:update table set name='111' where id=1;  此时不能进行修改操作

    2、排他锁:A事务中a行加了排他锁,B事务对a行加共享或排他锁都不能执行

      详细解释:排他锁不能与其他锁并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取行的锁,只有当前获取了排他锁的事务可以对数据进行读取和修改

         s1、s2两个会话共同操作一张表

      s1:select * from table where id=1 for update;

      s2:查询同张表数据没问题select * from table where id=1;或select * from table where id=2;

        若执行select * from table where id=2 for update;  此时会报错

    3、自增锁:针对自增列自增长的一种锁

      新建了一张表,往这张表中插入10条数据,未commit前回滚了,若此时向表中插入5条数据,id从11开始

    4、模拟死锁

     图左为s1,图右为s2

    ①s1、s2先分别对id=1与id=2添加排他锁

    ②s1中对id=2行添加排他锁,执行

    ③s2中对id=1行添加排他锁,执行

    此时相当于四个锁相互循环锁死,mysql会自动释放锁,这就模拟了死锁的场景

    作者:http://cnblogs.com/lyc-code/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权力。

  • 相关阅读:
    DNS子域授权,区域传送
    DNS BIND配置 配置基本缓存服务器 DNS正向解析 DNS反向解析
    DNS服务概念
    【转】Red5流服务器搭建(实现在线直播,流媒体视频播放和在线视频会议)
    CMD命令
    PHP Mysql数据库连接
    Mysql数据库报错1264
    Linux下nginx的安装
    windows下nginx的安装
    【转载】详解 $_SERVER 函数中QUERY_STRING和REQUEST_URI区别
  • 原文地址:https://www.cnblogs.com/lyc-code/p/14468683.html
Copyright © 2020-2023  润新知