mysql 并发锁表_MySQL锁表的用法,防止并发情况下的重复数据
早就听说lock tables和unlock tables这两个命令,从字面也大体知道,前者的作用是锁定表,后者的作用是解除锁定。但是具体如何用,怎么用,不太清楚。今天详细研究了下,总算搞明白了2者的用法。
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下测试通过。
上一篇:MySQL 显示表字段及注释等信息
下一篇:linux本地域名解析文件
mysql 并发锁表_MySQL锁表的用法,防止并发情况下的重复数据相关推荐
- mysql基础14(关于mysql数据库在没有主键情况下去除重复数据办法)
关于mysql数据库在没有主键情况下去除重复数据办法 约定 表名:mat 根据 cat 字段去重 新增加主键为 id 步骤 1.为mat新增一列自增主键 alter table mat add col ...
- mysql 并发避免锁表_MYSQL锁表的用法,防止并发情况下的重复数据
项目中有些使用的redis存储,当对redis进行rehash的时候感觉是比较麻烦的.于是写了个简单的读取redis到数据库的关键方法.仅供参考. package com.redis.web; imp ...
- MYSQL锁表的用法,防止并发情况下的重复数据
lock table 读锁定 如果一个线程获得在一个表上的read锁,那么该线程和所有其他线程只能从表中读数据,不能进行任何写操作. lock tables user read;//读锁定表 unlo ...
- mysql新增字段会锁表_MySQL锁(二)表锁:为什么给小表加字段会导致整个库挂掉?...
概述 表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持.最常使用的MYISAM与INNODB都支持表级锁定.表级锁定分为表共享 ...
- mysql insert是锁表还是锁行_mysql 锁表还是锁行
关于mysql的锁行还是锁表,这个问题,今天算是有了一点头绪,mysql 中 innodb是锁行的,但是项目中居然出现了死锁,锁表的情况.为什么呢?先看一下这篇文章. 做项目时由于业务逻辑的需要,必须 ...
- mysql 数据库查看锁表_mysql解锁表(如何查看数据库锁表)
如果两个程序都向表中写数据显然会造成很大的麻烦,甚至会有意外情况发生.如果表正由一个程序写入,同时进行读取的另一个程序也会产生混乱的结果. 锁定表的方法 防止客户机的请求互相干扰或者服务器与维护程序相 ...
- mysql unicode转汉字_Mysql数据库表引擎与字符集
Mysql数据库表引擎与字符集 1.服务器处理客户端请求 其实不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:客户端进程向服务器进程发送一段文本(MySQL语句),服务器进程处理 ...
- mysql oracle 锁机制_Mysql锁机制
1.Mysql锁的基本介绍 锁是计算机协调多个进程或线程并发访问某一资源的机制在数据库中,除传统的计算资源(CPU,IO,RAM)的竞争外,数据也是许多用户共享的资源,如何保证数据并发访问的一致性,是 ...
- mysql 事物隔离界别_MySQL锁与事务隔离级别
------------恢复内容开始------------ 一.概述 1.锁的定义 锁是计算机协调多个进程或线程并发访问某一资源的机制. 在数据库中,除了传统的计算资源(如CPU.RAM.IO等)的 ...
最新文章
- 美国科学院学报:如何在竞争激烈的环境下维持稳定的群体
- python web服务器学习笔记(五) 并发尝试之popen原理探究
- 可在广域网部署运行的QQ高仿版 -- GG叽叽(开源)
- 使用WKWebView替换UIWebView
- 启明云端分享|直接用ESP32-S2和ESP32-C3驱动1.54寸串口屏,有哪些区别呢,他们的亮点又有哪些呢
- 10个节省时间和改善工作流的Git技巧
- python里的define怎么用_如何用(?(DEFINE))在Python中编写正则表达式?
- qt qgis linux,QT_QGIS_基本使用
- java多分支流程图_Java 流程控制 之 分支结构(条件判断)
- 做一行就要把一行的本质研究透
- 慧都MES系统怎么实施?有哪些注意事项?
- java short 写法_Java数据类型short的使用方法
- 《DSP using MATLAB》Problem 7.16
- Netty内存池 (5w长文+史上最全)
- 「自控原理」5.1 频率特性及其图示
- nmap命令小结(一)
- Sublime text 3 注册码(转自晚晴幽草(简书作者))
- apache更改网站目录
- 用django搭建个人博客(一)
- 热门的前端UI组件库