对于MySQL来说,有三种锁的级别:页级、表级、行级
页级的典型代表引擎为BDB。
表级的典型代表引擎为MyISAM,MEMORY以及很久以前的ISAM。
行级的典型代表引擎为INNODB。
-我们实际应用中用的最多的就是行锁。
行级锁的优点如下:
1)、当很多连接分别进行不同的查询时减小LOCK状态。
2)、如果出现异常,可以减少数据的丢失。因为一次可以只回滚一行或者几行少量的数据。
行级锁的缺点如下:
1)、比页级锁和表级锁要占用更多的内存。
2)、进行查询时比页级锁和表级锁需要的I/O要多,所以我们经常把行级锁用在写操作而不是读操作。
3)、容易出现死锁。
对于写锁定如下:
1)、如果表没有加锁,那么对其加写锁定。
2)、否则,那么把请求放入写锁队列中。
对于读锁定如下:
1)、如果表没有加写锁,那么加一个读锁。
2)、否则,那么把请求放到读锁队列中。
当然我们可以分别用low_priority 以及high_priority在写和读操作上来改变这些行为。
如果想要在一个表上做大量的 INSERT 和 SELECT 操作,但是并行的插入却不可能时,可以将记录插入到临时表中,然后定期将临时表中的数据更新到实际的表里。可以用以下命令实现:
mysql> LOCK TABLES real_table WRITE, insert_table WRITE;
mysql> INSERT INTO real_table SELECT * FROM insert_table;
mysql> TRUNCATE TABLE insert_table;
mysql> UNLOCK TABLES;
InnoDB 使用行级锁,BDB 使用页级锁。对于 InnoDB 和 BDB 存储引擎来说,是可能产生死锁的。这是因为 InnoDB 会自动捕获行锁,BDB 会在执行 SQL 语句时捕获页锁的,而不是在事务的开始就这么做。
行级锁的优点有:
在很多线程请求不同记录时减少冲突锁。
事务回滚时减少改变数据。
使长时间对单独的一行记录加锁成为可能。
行级锁的缺点有:
比页级锁和表级锁消耗更多的内存。
当在大量表中使用时,比页级锁和表级锁更慢,因为他需要请求更多的所资源。
当需要频繁对大部分数据做 GROUP BY 操作或者需要频繁扫描整个表时,就明显的比其它锁更糟糕。
使用更高层的锁的话,就能更方便的支持各种不同的类型应用程序,因为这种锁的开销比行级锁小多了。
表级锁在下列几种情况下比页级锁和行级锁更优越:
很多操作都是读表。
在严格条件的索引上读取和更新,当更新或者删除可以用单独的索引来读取得到时:
UPDATE tbl_name SET column=value WHERE unique_key_col=key_value;
DELETE FROM tbl_name WHERE unique_key_col=key_value;
SELECT 和 INSERT 语句并发的执行,但是只有很少的 UPDATE 和 DELETE 语句。
很多的扫描表和对全表的 GROUP BY 操作,但是没有任何写表。
表级锁和行级锁或页级锁之间的不同之处还在于:
将同时有一个写和多个读的地方做版本(例如在MySQL中的并发插入)。也就是说,数据库/表支持根据开始访问数据时间点的不同支持各种不同的试图。其它名有:时间行程,写复制,或者是按需复制。
//执行SQL语句 锁掉stat_num表
$sql = "LOCK TABLES stat_num WRITE"; //表的WRITE锁定,阻塞其他所有mysql查询进程
$DatabaseHandler->exeCute($sql);
//执行更新或写入操作
$sql = "UPDATE stat_num SET `correct_num`=`correct_num`+1 WHERE stat_date='{$cur_date}'";
$DatabaseHandler->exeCute($sql);
//当前请求的所有写操作做完后,执行解锁sql语句
$sql = "UNLOCK TABLES";
$DatabaseHandler->exeCute($sql);
相关推荐
在MySQL中,主要存在两种类型的锁:行级锁(Row-Level Locks)和表级锁(Table-Level Locks)。InnoDB存储引擎默认支持行级锁,而MyISAM只支持表级锁。 行级锁能提供更高的并发性能,因为它只锁定操作影响的具体行...
在MySQL数据库管理中,锁定与解锁是至关重要的概念,它们主要用于多用户环境下的并发控制,以确保数据的一致性和完整性。本课程的目标是使学习者理解锁定和解锁的基本原理,并能够熟练设置这两种操作。 锁定机制在...
您可能感兴趣的文章:浅谈MySQL临时表与派生表Mysql跨表更新 多表update sql语句总结mysql锁表和解锁语句分享MySQL中基本的多表连接查询教程MySQL表字段设置默认值(图文教程及注意细节)MySQL中使用表别名与字段别名...
在MySQL数据库管理系统中,"锁表"是一种重要的并发控制机制,用于确保在多用户环境中数据的一致性和完整性。锁能够防止多个用户同时修改同一数据,从而避免数据冲突和不一致。本篇文章将深入探讨MySQL中的锁表机制...
在Oracle数据库管理中,了解如何查询表是否被锁定以及如何执行解锁操作是至关重要的技能,尤其是在处理并发事务、性能调优或解决死锁问题时。本文将深入探讨Oracle中的表锁机制,包括如何识别锁定的表,理解不同类型...
在深入探讨MySQL数据库的锁机制之前,我们首先需要了解锁的基本概念。在数据库系统中,锁是一种用来保障并发控制的机制,它用来协调不同事务对同一个数据对象的访问。锁的目的是为了防止多个事务并发操作时造成的...
MySQL,由Michael Widenius和David Axmark于1994年创立,是一款历经多年发展与演进的开源关系型数据库管理系统。从最初的beta版本到现在的成熟产品,MySQL经历了多次重大更新,添加了诸多功能,如子查询、视图、存储...
MySQL的锁机制是数据库管理系统中用于控制并发操作的重要机制,对于多用户环境下的数据一致性、事务隔离性和系统性能有着至关重要的影响。本文将深入探讨MySQL的高级锁机制,包括表锁和行锁,并提供一些优化建议。 ...
运行这个查询将给出一系列的解锁语句,可以复制并在SQL Server Management Studio中执行。 5. **总结** 了解如何查询和解锁被锁住的SQL语句是SQL Server管理员和开发人员必备的技能。当遇到锁问题时,首先应定位...
表级锁有两种模式,即表共享读锁(允许读操作,不允许写操作)和表独占写锁(不允许任何读写操作)。 行级锁,如InnoDB存储引擎所采用的,提供了更细粒度的锁定,允许更高的并发度。行级锁分为共享读锁(允许多个读...
页级锁是介于行级锁和表级锁之间的选择,一次锁定相邻的一组记录,它在加锁时间和冲突率上处于两者之间。BDB存储引擎支持页级锁,提供了一种折中的解决方案。 InnoDB存储引擎支持行级锁和表级锁。行级锁是通过索引...
- **高可靠性**:MySQL提供了数据完整性保护机制,例如事务处理、行级锁、备份和恢复功能,确保了数据的安全性和一致性。 - **高性能**:MySQL优化的查询处理器和存储引擎使得它能够处理大量并发连接和复杂的查询...
- **隐式锁与显式锁**:MySQL中的锁可以分为隐式锁和显式锁。隐式锁是由MySQL系统自动管理的,如在事务中自动加锁;而显式锁则是由数据库开发者通过特定的SQL命令手动加锁。 - **锁的类型**:主要有读锁(共享锁)和...
MySQL中的锁机制是数据库管理并发访问的关键技术,用于确保数据的一致性和完整性。本文主要讨论了MySQL中的五种锁:表锁、行锁、共享锁、排它锁和间隙锁。 1. 表锁:表锁是MySQL中最基础的锁类型,主要在MyISAM存储...
LOAD DATA INFILE 语句是 SELECT INTO OUTFILE 语句的逆操作,它可以从一个文本文件中读取数据并将其写入到一个表中。基本语法如下: ``` LOAD DATA [LOW_PRIORITY] [LOCAL] INFILE 'file_name.txt' [REPLACE | ...
在MySQL中,如果表被锁定,通常需要分析并解决导致锁的问题,而不是直接解锁。 了解并熟练掌握这些查询语句,将有助于数据库管理员高效地管理和维护数据库,确保系统的稳定运行和数据的安全性。通过学习《查询表...
MySQL 数据库部分,可能涵盖索引优化、事务处理、SQL语句编写规范等,以提高数据库操作的效率和数据一致性。 工程结构和设计规约,强调模块化、解耦和高内聚、低耦合的设计原则,帮助开发者构建易于维护和扩展的...
`LOCK TABLES`和`UNLOCK TABLES`语句用于显式地锁定和解锁表。`LOCK TABLES`允许指定当前线程要锁定的表及其锁定类型,如`READ`(只读)或`WRITE`(读写)。一旦锁定,其他线程无法进行读写操作,直到当前线程通过`...