MySQL 锁机制

Innodb的为行锁 MyISAM的为表锁

lock tables 命令是为当前线程锁定表.这里有2种类型的锁定,一种是读锁定,用命令 lock tables tablename read;另外一种是写锁定,用命令lock tables tablename write.下边分别介绍:

1. lock table 读锁定

如果一个线程获得在一个表上的read锁,那么该线程和所有其他线程只能从表中读数据,不能进行任何写操作。

下边我们测试下,测试表为user表。

不同的线程,可以通过开多个命令行MySQL客户端来实现:


时刻点


线程A(命令行窗口A)


线程B(命令行窗口B)


1


mysql> lock tables user read;

Query OK, 0 rows affected (0.00 sec)

mysql>

对user表加读锁定。


2


mysql> select * from user;

+------+-----------+

| id   | name      |

+------+-----------+

|   22 | abc       |

|  223 | dabc      |

| 2232 | dddabc    |

|   45 | asdsagd   |

|   23 | ddddddddd |

+------+-----------+

5 rows in set (0.00 sec)

mysql>

自己的读操作未被阻塞


mysql> select * from user;

+------+-----------+

| id   | name      |

+------+-----------+

|   22 | abc       |

|  223 | dabc      |

| 2232 | dddabc    |

|   45 | asdsagd   |

|   23 | ddddddddd |

+------+-----------+

5 rows in set (0.00 sec)

mysql>

其他线程的读也未被阻塞


3


mysql> insert into user values(12,‘test‘);

ERROR 1099 (HY000): Table ‘user‘ was locked with a READ lock and can‘t be updated

mysql>

发现本线程的写操作被阻塞


mysql> insert into user values(22,‘2test‘);

发现没有任何反应,一直等待中,说明没有得到写锁定,一直处于等待中。


4


mysql> unlock tables;

Query OK, 0 rows affected (0.00 sec)

mysql>

释放读锁定。


mysql> insert into user values(22,‘ddd‘);

Query OK, 1 row affected (1 min 27.25 sec)

mysql>

在线程A释放读锁后,线程B获得了资源,刚才等待的写操作执行了。


5


mysql> lock tables user read local;

Query OK, 0 rows affected (0.00 sec)

mysql>

获得读锁定的时候增加local选项。


mysql> insert into user values(2,‘b‘);

Query OK, 1 row affected (0.00 sec)

mysql>

发现其他线程的insert未被阻塞。


6


mysql> update user set name  = ‘aaaaaaaaaaaaaaaaaaaaa‘ where id = 1;

但是其他线程的update操作被阻塞了。

注意:user表必须为Myisam表,以上测试才能全部OK,如果user表为innodb表,则lock tables user read local命令可能没有效果,也就是说,如果user表为innodb表,第6时刻将不会被阻塞,这是因为INNODB表是事务型的,对于事务表,例如InnoDB和BDB,--single-transaction是一个更好的选项,因为它不根本需要锁定表

2. lock table 写锁定

如果一个线程在一个表上得到一个   WRITE   锁,那么只有拥有这个锁的线程可以从表中读取和写表。其它的线程被阻塞。

写锁定的命令:lock tables user write.user表为Myisam类型的表。

参考如下测试:


时刻点


线程A(命令行窗口A)


线程B(命令行窗口B)


1


mysql> lock tables user write;

Query OK, 0 rows affected (0.00 sec)

对user表加写锁定。


2


mysql> select * from user;

+----+-----------------------+

| id | name                  |

+----+-----------------------+

|  1 | aaaaaaaaaaaaaaaaaaaaa |

|  2 | b                     |

+----+-----------------------+

2 rows in set (0.00 sec)

自己可以继续进行读操作


mysql> select * from user;

其他线程读操作被阻塞。


3


mysql> unlock tables ;

Query OK, 0 rows affected (0.00 sec)

释放锁定。


4


mysql> select * from user;

+----+-----------------------+

| id | name                  |

+----+-----------------------+

|  1 | aaaaaaaaaaaaaaaaaaaaa |

|  2 | b                     |

+----+-----------------------+

2 rows in set (32.56 sec)

其他线程获得资源,可以读数据了。

以上所有结果均在MySQL 5.4.3下测试通过。

时间: 2024-10-12 04:40:32

MySQL 锁机制的相关文章

mysql锁机制(转载)

锁是计算机协调多个进程或线程并发访问某一资源的机制 .在数据库中,除传统的 计算资源(如CPU.RAM.I/O等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发访问的一致性.有效性是所有数据库必须解决的一 个问题,锁冲突也是影响数据库并发访问性能的一个重要因素. 从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂.本章我们着重讨论MySQL锁机制 的特点,常见的锁问题,以及解决MySQL锁问题的一些方法或建议. MySQL锁概述相对其他数据库而言,MySQL的锁机制比较简单,

对mysql锁机制的学习

1.对于mysql学习,经常翻看一些博客,论坛,好像或多或少有mysq锁机制的学习与总结,所以今天有必要 对mysql锁机制的一些个人的总结,以便以后深入的学习. 2.学习这件事,从来都是“深入浅出”的,今天留个痕迹,说不定以后“受益匪浅”. a.数据库锁是什么 数据库锁就是为了保证数据库数据的一致性在一个共享资源被并发访问时使得数据访问顺序化的机制. MySQL数据库的锁机制比较独特,支持不同的存储引擎使用不同的锁机制. b.mysql锁机制的3中类型 表级锁,行级锁,页级锁 c.各级锁的特点

Mysql锁机制和事务控制

如何加锁 锁定表的语法:    LOCK TABLES    tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}    [, tbl_name [AS alias] {READ [LOCAL] | [LOW_PRIORITY] WRITE}] ...解锁语法:    UNLOCK TABLES innodb的存储引擎提供行级锁,支持共享锁和排他锁两种锁定模式,以及四种不同的隔离级别. 死锁 InnoDB自动检测事务的死锁,并回滚一个

mysql锁机制详解

前言 大概几个月之前项目中用到事务,需要保证数据的强一致性,期间也用到了mysql的锁,但当时对mysql的锁机制只是管中窥豹,所以本文打算总结一下mysql的锁机制. 本文主要论述关于mysql锁机制,mysql版本为5.7,引擎为innodb,由于实际中关于innodb锁相关的知识及加锁方式很多,所以没有那么多精力罗列所有场景下的加锁过程并加以分析,仅根据现在了解的知识,结合官方文档,说说自己的理解,如果发现有不对的地方,欢迎指正. 概述 总的来说,InnoDB共有七种类型的锁: 共享/排它

mysql锁机制整理

Auth: jinDate: 20140506 主要参考整理资料MYSQL性能调优与架构设计-第七章 MYSQL锁定机制http://www.cnblogs.com/ggjucheng/archive/2012/11/14/2770445.html理解MySQL--架构与概念http://www.cnblogs.com/yequan/archive/2009/12/24/1631703.html 一.mysql锁类型及应用介绍1.锁类型和应用类型相對其他數據庫而言,MySQL的鎖機制比較簡單,其

MySQL锁机制浅析

MySQL使用了3种锁机制 行级锁,开销大,加锁慢,会出现死锁,发生锁冲突的概率最高,并发度也最高 表级锁,开销小,加锁快,不会出现死锁,发生锁冲突的概率最低,并发度最低 页级锁,开销和加锁时间界于表锁和行锁之间:会出现死锁:锁定粒度界于表锁和行锁之间,并发度一般 MySQL的存储引擎,这里指常用的,InnoDB,默认是行级锁,如果不指定主键的话,那么就是表级锁了,这点切记 MyISAM是表锁 innoDB 先来了解下MySQL事务 事务是由一组sql语句组成的逻辑处理单元,有4个属性ACID

Mysql 锁机制和事务

InnoDB 锁机制 InnoDB存储引擎支持行级锁 其大类可以细分为共享锁和排它锁两类 共享锁(S):允许拥有共享锁的事务读取该行数据.当一个事务拥有一行的共享锁时,另外的事务可以在同一行数据也获得共享锁,但另外的事务无法获得同一行数据上的排他锁 排它锁(X):允许拥有排它锁的事务修改或删除该行数据. 当一个事务拥有一行的排他锁时,另外的事务在此行数据上无法获得共享锁和排它锁,只能等待第一个事务的锁释放 除了共享锁和排他锁之外, InnoDB也支持意图锁.该锁类型是属于表级锁,表明事务在后期会

20.Mysql锁机制

20.锁问题锁是计算机协调多个进程或线程并发访问某一资源的机制. 20.1 Mysql锁概述锁类型分为表级锁.页面锁.行级锁.表级锁:一个线程对表进行DML时会锁住整张表,其它线程只能读该表,如果要写该表时将产生锁等待. 优点:开销少.加锁快.不会产生死锁.缺点:锁粒度大.容易产生锁等待.并发低.行级锁:一个线程对表进行DML时会锁住该表影响的行,其它线程可以读该表,也可以DML该表其它的行,如果要DML已被锁定的行时将产生锁等待. 缺点:开销大.加锁慢.会产生死锁.优点:锁粒度小.不容易产生锁

6.mysql 锁机制

概述 定义: 锁是计算机协调多个进程或者线程并发访问某一资源的机制 在数据库中,除传统的计算资源(如CPU,RAM,IO等)的争用以外,数据也是一种供许多用户共享的资源.如何保证数据并发 访问的一致性.有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发访问性能的一个重要因素.从这个角度 来说,锁对数据库而言显得尤其重要,也更加复杂. 实际场景案例:生活购物 打个比方,我们在淘宝上抢购一件商品,商品只有一件库存,这个时候如果有很多人想去买,那么如何解决是你买到还是其他人买到的问题? 这

Mysql锁机制--乐观锁 & 悲观锁

前言 mysql的并发操作时而引起的数据的不一致性(数据冲突): 丢失更新:两个用户(或以上)对同一个数据对象操作引起的数据丢失. 解决方案:1.悲观锁,假设丢失更新一定存在:sql后面加上for update:这是数据库的一种机制. 2.乐观锁,假设丢失更新不一定发生.update时候存在版本,更新时候按版本号进行更新. 第一部分 悲观锁 1 概念 悲观锁,正如其名,它指的是对数据被外界(包括当前系统的其它事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于