部分总结参考博客
http://b.codejs.cc/articles/2017/10/23/1508749325215.html http://blog.csdn.net/cug_jiang126com/article/details/50544728

MyISAM 只支持表锁

show create table crm_member; ##查看引擎
alter table crm_member engine = MyISAM; ##更改表引擎

读锁演示

Session 1 读锁 其它session可以读不可写

lock table crm_member read;

Session 1 锁等待时间设置

select @@global.lock_wait_timeout; ##查看锁等待时间设置

set @@global.lock_wait_timeout = 20; ##设置锁等待时间为20秒

Session 2 查询数据 不影响

MariaDB [member]> select name from crm_member where id = 4;
+------+
| name |
+------+
| 222 |
+------+
1 row in set (0.00 sec)

Session 2 更新数据

MariaDB [member]>
MariaDB [member]> update crm_member set name = '222' where id = 4; ## 进入锁等待

Session 1 查看进程

show processlist;

| 97 | root | localhost           | member | Query   |   120 | Waiting for table level lock | update crm_member set name = '222' where id = 4 |    0.000 |

## 等待一个表级别的锁

Session 1 释放锁

MariaDB [member]> unlock tables;
Query OK, 0 rows affected (0.00 sec)

Session 2 获得锁 立即更新数据

MariaDB [member]> update crm_member set name = '222' where id = 4;
Query OK, 0 rows affected (3 min 9.38 sec)
Rows matched: 1 Changed: 0 Warnings: 0

Session 2 锁等待超时

MariaDB [member]> update crm_member set name = '222' where id = 4;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

写锁演示

Session 1 添加写锁

MariaDB [member]> lock table crm_member write;
Query OK, 0 rows affected (0.00 sec)

Session 1 添加写锁

MariaDB [member]> lock table crm_member write;
Query OK, 0 rows affected (0.00 sec)

Session 2 读数据

MariaDB [member]> select name from crm_member where id = 4;

Session 1 查看进程

MariaDB [member]> show processlist;

| 109 | root | localhost           | member | Query   |     2 | Waiting for table metadata lock | select name from crm_member where id = 4 |    0.000 |

## 等待一个元数据的锁

Session 2 读数据 锁等待超时

MariaDB [member]> select name from crm_member where id = 4;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

InnoDB 锁 既支持表锁(与MyISAM相同) 也支持 行锁。


排它锁演示

方式1 Session 1 直接update 其它session不可以读不可写 除非快照读

MariaDB [member]> begin;
Query OK, 0 rows affected (0.00 sec) MariaDB [member]> update crm_member set name = 'aaaaaa' where id = 4;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

方式2 Session 1 for-update 其它session不可以读不可写 除非快照读

MariaDB [member]> begin;
Query OK, 0 rows affected (0.00 sec) MariaDB [member]> select name from crm_member where id = 4 for update;

Session 2 方式1 事务方式 开始更新操作相同的记录

MariaDB [member]> begin;
Query OK, 0 rows affected (0.00 sec) MariaDB [member]> update crm_member set name = 'bbb' where id = 4; ## 进入锁等待

Session 2 方式2 普通更新操作

MariaDB [member]> update crm_member set name = 'bbb' where id = 4;

Session 1 查看进程

MariaDB [member]> show processlist;
+-----+------+---------------------+--------+---------+-------+----------+-------------------------------------------------+----------+
| Id | User | Host | db | Command | Time | State | Info | Progress |
+-----+------+---------------------+--------+---------+-------+----------+-------------------------------------------------+----------+
| 109 | root | localhost | member | Query | 2 | updating | update crm_member set name = 'ccc' where id = 4 | 0.000 |
+-----+------+---------------------+--------+---------+-------+----------+-------------------------------------------------+----------+ ## 有一个更新等待

Session 2 锁等待超时

MariaDB [member]> update crm_member set name = 'bbb' where id = 4;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

Session 1 查看数据 已经更改

MariaDB [member]> select name from crm_member where id = 4;
+------+
| name |
+------+
| ccc |
+------+

Session 2 读取到的数据没有更改 只能读取未提交版本的数据

MariaDB [member]> select name from crm_member where id = 4;
+------+
| name |
+------+
| bbb |
+------+

Mysql 锁总结的更多相关文章

  1. mysql锁

    锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数 ...

  2. Mysql锁初步

    存储引擎 要了解mysql的锁,就要先从存储引擎说起. 常用存储引擎列表如下图所示: 最常使用的两种存储引擎: Myisam是Mysql的默认存储引擎.当create创建新表时,未指定新表的存储引擎时 ...

  3. mysql锁表机制及相关优化

    (该文章为方便自己查阅,也希望对大家有所帮助,转载于互联网) 1. 锁机制 当前MySQL支持 ISAM, MyISAM, MEMORY (HEAP) 类型表的表级锁,BDB 表支持页级锁,InnoD ...

  4. MySQL锁系列3 MDL锁

    http://www.cnblogs.com/xpchild/p/3790139.html   MySQL为了保护数据字典元数据,使用了metadata lock,即MDL锁,保证在并发的情况下,结构 ...

  5. 01 MySQL锁概述

    锁是计算机协调多个进程或线程并发访问某一资源的机制.在数据库中,除传统的计算资源(如CPU.RAM.I/O 等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有 ...

  6. Mysql锁机制介绍

    Mysql锁机制介绍 一.概况MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制.比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking ...

  7. MySQL锁等待分析【2】

    MySQL锁等待分析[1]中对锁等待的分析是一步一步来的.虽然最后是分析出来了,可是用时是比较长的:理清各个表之间的关系后,得到如下SQL语句,方便以后使用 select block_trx.trx_ ...

  8. MySQL锁与MVCC

    --MySQL锁与MVCC --------------------2014/06/29 myisam表锁比较简单,这里主要讨论一下innodb的锁相关问题. innodb相比oracle锁机制简单许 ...

  9. MySQL锁总结

    本文同时发表在https://github.com/zhangyachen/zhangyachen.github.io/issues/78 MySQL 锁基础 参考了何登成老师文章的结构MySQL 加 ...

  10. Mysql锁机制--并发事务带来的更新丢失问题

    Mysql 系列文章主页 =============== 刚开始学习 Mysql 锁的时候,觉得 Mysql 使用的是行锁,再加上其默认的可重复读的隔离级别,那就应该能够自动解决并发事务更新的问题.可 ...

随机推荐

  1. Nginx+tomcat集群环境搭建(Windows下)

    实验环境 windows xp sp3 Nginx版本:1.5.12: 下载地址:http://nginx.org/en/download.html Tomcat版本:6.0.39 下载地址:http ...

  2. Json----Jackson 下载地址

    下载地址: http://repo1.maven.org/maven2/com/fasterxml/jackson/

  3. 简单实现人工智能:百度aip+tuling123

    目录结构: app.py # -*- coding: utf-8 -*- # __author: ward # data: 2018/12/21 # @File: app from flask imp ...

  4. Java三大特性之---封装

    封装从字面上来理解就是包装的意思,专业点就是信息隐藏,是指利用抽象数据类型将数据和基于数据的操作封装在一起,使其构成一个不可分割的独立实体,数据被保护在抽象数据类型的内部,尽可能地隐藏内部的细节,只保 ...

  5. 143 Reorder List 重排链表

    给定一个单链表L:L0→L1→…→Ln-1→Ln,重新排列后为: L0→Ln→L1→Ln-1→L2→Ln-2→…必须在不改变节点的值的情况下进行原地操作.例如,给定链表 {1,2,3,4},按要求重排 ...

  6. 为RecyclerView打造通用Adapter 让RecyclerView更加好用

    原文出处: 张鸿洋 (Granker,@鸿洋_ ) 一.概述 记得好久以前针对ListView类控件写过一篇打造万能的ListView GridView 适配器,如今RecyclerView异军突起, ...

  7. Java基础学习-一切皆为对象

    一切皆为对象 引用 String s; //s是引用,并不是对象. String s = "asdf" //创建一个引用的同时便进行初始化

  8. HTTPS时代已来,你做好准备了吗?

    早在今年年初,Google在其安全博客上已经表明,从7月开始,Chrome68会将所有的HTTP网站标记为不安全.随后,Mozilla也表明,Firefox浏览器也准备将所有HTTP网站标记为不安全. ...

  9. Android小玩意儿-- 从头开发一个正经的MusicPlayer(一)

    之前从未接触过音乐播放器这块东西的开发.今天偶然想做一个自己的音乐播放器.算是练练手.既然要做,就要做一个正儿八经的App.很多网上的资料也是模模糊糊,不是很全,现在开始,自己摸索着尝试着一步一步的做 ...

  10. 开启apahce的mod_speling.so模块,让使用apahce http服务器不再有大小写烦恼

    今天把服务器重新安装系统,做apache调优前,优化下apache对网络地址大小写不区分的支持.记录如下: 编译mod_speling.so模块去除Apache-url大小写字母敏感的配置 1. 进入 ...