MySQL 两种锁操作

最近开发中遇到一些问题,这里记录下Mysql中的两种表级别的锁。

读锁:所有的会话只能进行SELECT语句查询

lock tables table_name READ;

写锁:只有当前会话能增删改查,其他会话无法任何操作

lock tables table_name WRITE

下面是个简单测试:

首先测试Write

下面先开启一个客户端进行如下操作:

mysql> show open tables from numtest;
+----------+-------+--------+-------------+
| Database | Table | In_use | Name_locked |
+----------+-------+--------+-------------+
| numtest  | num   |      1 |           0 |
+----------+-------+--------+-------------+
1 row in set (0.00 sec)

mysql> lock tables num WRITE;
Query OK, 0 rows affected (0.00 sec)

mysql> show open tables from numtest;
+----------+-------+--------+-------------+
| Database | Table | In_use | Name_locked |
+----------+-------+--------+-------------+
| numtest  | num   |      1 |           0 |
+----------+-------+--------+-------------+
1 row in set (0.00 sec)

mysql> select count(*) from num;
+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (0.00 sec)

然后开启客户端二操作:

mysql> select count(*) from numtest.num;

此时 客户端二会被lock

查看processlist得到验证:

mysql> show processlist;
+--------+------+-----------+---------+---------+------+---------------------------------+----------------------------------+
| Id     | User | Host      | db      | Command | Time | State                           | Info                             |
+--------+------+-----------+---------+---------+------+---------------------------------+----------------------------------+
|      2 | root | localhost | numtest | Query   |    0 | starting                        | show processlist                 |
| 101003 | root | localhost | NULL    | Query   |    7 | Waiting for table metadata lock | select count(*) from numtest.num |
+--------+------+-----------+---------+---------+------+---------------------------------+----------------------------------+
2 rows in set (0.00 sec)

然后客户端A 释放锁:

mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)

客户端二 执行OK(被锁了18s)。

mysql> select count(*) from numtest.num;
+----------+
| count(*) |
+----------+
|        1 |
+----------+
1 row in set (18.42 sec)

再测试Read Lock,同一个session操作。

mysql> lock tables num READ;
Query OK, 0 rows affected (0.00 sec)

mysql>
mysql>
mysql> insert into num values (1000,"2222");
ERROR 1099 (HY000): Table ‘num‘ was locked with a READ lock and can‘t be updated
mysql> show processlist;
+--------+------+-----------+---------+---------+------+----------+------------------+
| Id     | User | Host      | db      | Command | Time | State    | Info             |
+--------+------+-----------+---------+---------+------+----------+------------------+
|      2 | root | localhost | numtest | Query   |    0 | starting | show processlist |
| 101003 | root | localhost | NULL    | Sleep   | 2973 |          | NULL             |
+--------+------+-----------+---------+---------+------+----------+------------------+
2 rows in set (0.00 sec)

通过以上命令发现当前session也无法进行写操作

然后 释放锁,由client 2 进行写操作没问题

mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)

mysql> select count(*) from num;
+----------+
| count(*) |
+----------+
|        2 |
+----------+
1 row in set (0.00 sec)

mysql>
mysql> show processlist;
+--------+------+-----------+---------+---------+------+----------+------------------+
| Id     | User | Host      | db      | Command | Time | State    | Info             |
+--------+------+-----------+---------+---------+------+----------+------------------+
|      2 | root | localhost | numtest | Query   |    0 | starting | show processlist |
| 101003 | root | localhost | numtest | Sleep   |   92 |          | NULL             |
+--------+------+-----------+---------+---------+------+----------+------------------+

死锁的一般情况可以通过超时时间设定、或者kill掉被锁住的进程。

以上!

原文地址:https://www.cnblogs.com/ayann204/p/11006943.html

时间: 2024-10-11 13:56:01

MySQL 两种锁操作的相关文章

TI_DSP_SRIO - 两种SRIO操作模式

DSP SRIO协议的逻辑层定义了操作协议和相应的包格式.DSP上SRIO支持的逻辑层业务(数据发送方法)主要是直接IO/DMA(Direct IO/ Direct Memory Access)和消息传递(Message Passing). ?直接IO/DMA模式是最简单实用的传输方式,其前提是主设备知道被访问端的存储器映射.在这种模式下,主设备可以直接读写从设备的存储器.可以硬件直接实现. ?消息传递模式则类似于以太网的传输方式,它不要求主设备知道被访问设备的存储器状况.数据在被访问设备中的位

Mysql两种存储引擎的优缺点

MyISAM引擎是一种非事务性的引擎,提供高速存储和检索,以及全文搜索能力,适合数据仓库等查询频繁的应用.MyISAM中,一个table实际保存为三个文件,.frm存储表定义,.MYD存储数据,.MYI存储索引.  NULL值被允许在索引的列中. 如何查看表的存储引擎 SHOW TABLE STATUS FROM 数据库 WHERE Name = '表名' InnoDB:这种类型是事务安全的.它与BDB类型具有相同的特性,它们还支持外键.InnoDB表格速度很快.具有比BDB还丰富的特性, 因此

谈谈MySQL两种存储引擎

Mysql有两种存储引擎:InnoDB与Myisam 二者之间有六大区别:   MyISAM InnoDB 构成上的区别: 每个MyISAM在磁盘上存储成三个文件.第一个 文件的名字以表的名字开始,扩展名指出文件类型..frm文件存储表定义.数据文件的扩 展名为.MYD (MYData).索引文件的扩 展名是.MYI (MYIndex). 基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的 大小只受限于操作系统文件的大小,一般为 2GB 事务处理上方面: MyISAM类

30.3. MySQL四种语句操作,SQL语法等简介

SQL语言的兴起与语法标准 20世纪70年代,IBM开发出SQL,用于DB21981年,IBM推出SQL/DS数据库业内标准微软和Sybase的T-SQL,Oracle的PL/SQLSQL作为关系型数据库所使用的标准语言,最初是基于IBM的实现在1986年被批准的. 1987年,"国际标准化组织(ISO)" 把ANSI(美国国家标准化组织)SQL作为国际标准.SQL:ANSI SQLSQL-1986, SQL-1989, SQL-1992, SQL-1999, SQL-2003,SQL

MySQL - 两种存储引擎 (MyISAM PK InnoDB) + MVCC

总结 1.两种存储引擎各有各的有点,MyISAM专注性能,InnoDB专注事务.两者最大的区别就是InnoDB支持事务,和行锁. 2.InnoDB采用MVCC(Multi-Version Concurrency Control 多版本并发控制)来支持高并发,一种行级锁的变种.MVCC是通过保存数据在某一个时间点的快照来实现的,也就是说无论事务执行多久,每个事务看到的数据都是一致的.InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现,这两个列一个保存了行的创建时间,一个保存了行的过

MySQL两种表存储结构MyISAM和InnoDB的性能比较测试

转载 http://www.jb51.net/article/5620.htm MySQL支持的两种主要表存储格式MyISAM,InnoDB,上个月做个项目时,先使用了InnoDB,结果速度特别慢,1秒钟只能插入10几条.后来换成MyISAM格式,一秒钟插入上万条.当时决定这两个表的性能也差别太大了吧.后来自己推测,不应该差别这么慢,估计是写的插入语句有问题,决定做个测试:测试环境:Redhat Linux9,4CPU,内存2G,MySQL版本为4.1.6-gamma-standard测试程序:

网络协议 finally{ return问题 注入问题 jdbc注册驱动问题 PreparedStatement 连接池目的 1.2.1DBCP连接池 C3P0连接池 MYSQL两种方式进行实物管理 JDBC事务 DBUtils事务 ThreadLocal 事务特性 并发访问 隔离级别

1.1.1 API详解:注册驱动 DriverManager.registerDriver(new com.mysql.jdbc.Driver());不建议使用 原因有2个: >导致驱动被注册2次. >强烈依赖数据库的驱动jar 解决办法: Class.forName("com.mysql.jdbc.Driver"); 1.1.2 API详解:java.sql.Statement接口: 操作sql语句,并返回相应结果 String sql = "某SQL语句&qu

mysql 两种引擎的比较

参考链接:https://blog.csdn.net/feeltouch/article/details/65459028 文章摘要: 两种引擎的名称是:Innodb 和 MyIASM. Innodb 支持事务.行级锁.外键.MyIASM 不支持事务.行级锁.外键. 当读操作多于写操作,且不需要支持事务时,可以使用 MyIASM 引擎. 原文地址:https://www.cnblogs.com/mexding/p/9427257.html

MySql两种存储引擎的区别

MyISAM: 不支持事务,但是每次查询都是原子的: 支持表级锁,即每次操作是对整个表加锁: 存储表的总行数: 一个MYISAM表有三个文件:索引文件.表结构文件.数据文件: 采用菲聚集索引,索引文件的数据域存储指向数据文件的指针.辅索引与主索引基本一致,但是辅索引不用保证唯一性. InnoDb: 支持ACID的事务,支持事务的四种隔离级别: 支持行级锁及外键约束:因此可以支持写并发: 不存储总行数: 一个InnoDb引擎存储在一个文件空间(共享表空间,表大小不受操作系统控制,一个表可能分布在多