锁表的机制
为了给高并发情况下的mysql进行更好的优化,有必要了解一下mysql查询更新时的锁表机制。
一、概述
MySQL有三种锁的级别:页级、表级、行级。
MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level
locking),但也支持表级锁;InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。
MySQL这3种锁的特性可大致归纳如下:
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
二、MyISAM表锁
MyISAM存储引擎只支持表锁,是现在用得最多的存储引擎。
1、查询表级锁争用情况
可以通过检查table_locks_waited和table_locks_immediate状态变量来分析系统上的表锁定争夺:
mysql> show status like ‘table%’;
+———————–+———-+
| Variable_name | Value |
+———————–+———-+
| Table_locks_immediate | 76939364 |
| Table_locks_waited | 305089 |
+———————–+———-+
2 rows in set (0.00 sec)Table_locks_waited的值比较高,说明存在着较严重的表级锁争用情况。
2、MySQL表级锁的锁模式
MySQL的表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write
Lock)。MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁。
所以对MyISAM表进行操作,会有以下情况:
a、对MyISAM表的读操作(加读锁),不会阻塞其他进程对同一表的读请求,但会阻塞对同一表的写请求。只有当读锁释放后,才会执行其它进程的写操作。
b、对MyISAM表的写操作(加写锁),会阻塞其他进程对同一表的读和写操作,只有当写锁释放后,才会执行其它进程的读写操作。
下面通过例子来进行验证以上观点。数据表gz_phone里有二百多万数据,字段id,phone,ua,day。现在同时用多个客户端同时对该表进行操作分析。
3、并发插入
原则上数据表有一个读锁时,其它进程无法对此表进行更新操作,但在一定条件下,MyISAM表也支持查询和插入操作的并发进行。
MyISAM存储引擎有一个系统变量concurrent_insert,专门用以控制其并发插入的行为,其值分别可以为0、1或2。
a、当concurrent_insert设置为0时,不允许并发插入。
b、当concurrent_insert设置为1时,如果MyISAM表中没有空洞(即表的中间没有被删除的行),MyISAM允许在一个进程读表的同时,另一个进程从表尾插入记录。这也是MySQL的默认设置。
c、当concurrent_insert设置为2时,无论MyISAM表中有没有空洞,都允许在表尾并发插入记录。
4、MyISAM的锁调度
由于MySQL认为写请求一般比读请求要重要,所以如果有读写请求同时进行的话,MYSQL将会优先执行写操作。这样MyISAM表在进行大量的更新操作时(特别是更新的字段中存在索引的情况下),会造成查询操作很难获得读锁,从而导致查询阻塞。
我们可以通过一些设置来调节MyISAM的调度行为:
a、通过指定启动参数low-priority-updates,使MyISAM引擎默认给予读请求以优先的权利。
b、通过执行命令SET LOW_PRIORITY_UPDATES=1,使该连接发出的更新请求优先级降低。
c、通过指定INSERT、UPDATE、DELETE语句的LOW_PRIORITY属性,降低该语句的优先级。
上面3种方法都是要么更新优先,要么查询优先的方法。这里要说明的就是,不要盲目的给mysql设置为读优先,因为一些需要长时间运行的查询操作,也会使写进程“饿死”。只有根据你的实际情况,来决定设置哪种操作优先。这些方法还是没有从根本上同时解决查询和更新的问题。
在一个有大数据量高并发表的mysql里,我们还可采用另一种策略来进行优化,那就是通过mysql主从(读写)分离来实现负载均衡,这样可避免优先哪一种操作从而可能导致另一种操作的堵塞。下面将用一个篇幅来说明mysql的读写分离技术
相关推荐
SAP 锁表和解锁机制详解 SAP 锁表和解锁机制是 SAP 系统中的一种机制,用于控制对数据库表的访问,以确保数据的一致性和安全性。在本文中,我们将详细介绍 SAP 锁表和解锁机制的概念、实现方法和应用场景。 一、锁...
在数据库管理中,锁表机制是用于确保数据一致性和并发控制的重要工具。当某个事务对某张表进行读写操作时,可能会对该表施加锁定,防止其他事务同时对该表进行修改。在某些情况下,我们需要查询哪些表被锁住了以及...
本篇文章将深入探讨MySQL中的锁表机制及其相关概念。 首先,我们来看看`SHOW STATUS LIKE 'Table%'`这个命令。在MySQL中,`SHOW STATUS`语句用于显示服务器的各种状态信息,包括系统性能、内存使用等。当加上`LIKE ...
本文将深入探讨Oracle中的锁机制,特别是如何锁表与解锁,以及相关的SQL查询语句,帮助数据库管理员和开发人员更好地理解和管理Oracle数据库的锁状态。 #### 锁的类型 在Oracle中,锁主要分为两种类型: 1. **TX...
Sybase 数据库锁机制和锁表查询 Sybase 数据库锁机制是指数据库管理系统中用于控制并发访问和维护数据一致性的机制。锁机制可以防止多个事务同时访问同一资源,避免数据的不一致和损坏。 在 Sybase 数据库中,锁...
Informix 数据库锁表问题解决方案 在 Informix 数据库中,锁表问题是一个常见的错误,会导致系统性能下降和数据不一致。锁表问题的解决需要对数据库进行深入的分析和诊断。本文将讨论 Informix 数据库锁表问题的...
锁表是 SQL Server 中的一种机制,用于控制对数据库表的访问。锁表可以防止多个用户同时修改同一条记录,从而避免数据不一致的问题。SQL Server 提供了多种锁表方式,包括共享锁、排它锁、修改锁等。 锁表语句 锁...
#### 二、锁表机制 在Oracle中,为了防止并发操作导致的数据不一致问题,引入了锁定机制。锁定机制能够确保在某个事务修改数据期间,其他事务无法访问或修改同一份数据。根据锁定范围的不同,可以分为行级锁定和表...
在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁(用来保证表的结构不被用户修改),TX锁称为事务锁或行级锁。当Oracle执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统...
本文将深入探讨如何检查Sybase中的锁表、如何解锁以及如何查看锁相关的命令,同时也会提及bcp工具的使用。 一、检查锁表 在Sybase中,可以使用`sp_lock`系统存储过程来检查当前系统的锁情况。执行以下命令: ```sql...
### SQL的锁机制 在数据库管理系统(DBMS)中,锁机制是一种重要的并发控制手段,用于确保多个用户或进程能够安全地访问共享资源而不发生冲突。本文将详细探讨SQL Server中的锁机制及其工作原理。 #### 一、为什么...
SQL Server的锁机制是数据库管理系统中用于控制并发访问和维护数据完整性的重要机制。它确保了在多用户环境中,数据能够被正确地读取和修改,防止出现数据不一致的情况。以下是对SQL Server锁机制的详细解释: 1. *...
在 SQL Server 中,锁机制分为四个级别:表级、盘区级、页级、行级。锁的分类有共享锁、更新锁、排它锁、意图锁、系统锁等。 共享锁(S):SQL Server 对 select 实施共享锁。共享锁可以和一些锁共存,尤其是其它...
锁表操作如`LOCK TABLES tbl_name READ/WRITE;`可以在备份或维护时使用,它会阻止其他用户对指定表进行读写操作,直到执行`UNLOCK TABLES;`为止。 总的来说,理解和正确使用MySQL的锁机制对于优化并发性能和避免...
SQL Server的锁机制是数据库管理系统中用于控制并发访问的关键组件,确保数据的完整性和一致性。在SQL Server中,锁用于管理事务之间的数据访问,防止数据的不一致性,并提高多用户的并发性。以下是对SQL Server锁...
在Informix数据库管理系统中,锁表处理是一项...综上所述,Informix的锁表处理涉及对数据库锁机制的理解、使用监控工具诊断问题以及采取适当的恢复策略。正确处理锁表问题对于保证数据库系统的稳定性和性能至关重要。
MySQL的锁机制是数据库管理系统中用于控制并发操作的重要机制,对于多用户环境下的数据一致性、事务隔离性和系统性能有着至关重要的影响。本文将深入探讨MySQL的高级锁机制,包括表锁和行锁,并提供一些优化建议。 ...
相对其他数据库而言,MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level ...
只有通过深入了解锁机制的工作原理和使用方法,才能避免锁表问题的出现,并提高数据库应用的性能。 Oracle数据库锁机制的分类: 1.null空锁 2.Row-S共享锁 3.Row-X行专用锁 4.Share共享锁 5.S/Row-X共享行专用锁 ...
Oracle的锁机制是数据库管理系统中一个关键的组成部分,它的主要目标是确保在多用户环境下,数据的读一致性、完整性和并行性。Oracle提供了多种类型的锁来满足这些需求。 首先,按照是否独占,锁分为排它锁(X锁)...