转:http://www.kubiji.cn/topic-id2510.html
行级锁是
mysql中粒度最小的一种锁,他能大大减少
数据库操作的冲突。但是粒度越小,实现的成本也越高。
myisam引擎只支持表级锁,而
innodb引擎能够支持行级锁,下面的内容也是针对INNODB行级锁展开的。
INNODB的行级锁有共享锁(S LOCK)和排他锁(X LOCK)两种。共享锁允许事物读一行记录,不允许任何线程对该行记录进行修改。排他锁允许当前事物删除或更新一行记录,其他线程不能操作该记录。
共享锁:
用法: SELECT ... LOCK IN SHARE MODE;
MySQL会对查询结果集中每行都添加共享锁。
锁申请前提:当前没有线程对该结果集中的任何行使用排他锁,否则申请会阻塞。
操作限制:
使用共享锁线程与不使用共享锁线程对锁定记录操作限制表
线程 读取操作 写入操作 共享锁申请 排他锁申请
使用共享锁 可读 可写/不可写(报错) 可申请 可申请
不使用共享锁 可读 不可写(阻塞) 可申请 不可申请(阻塞)
1. 使用共享锁线程可对其锁定记录进行读取,其他线程同样也可对锁定记录进行读取操作,并且这两个线程读取的数据都属于同一个版本。
2. 对于写入操作,使用共享锁的线程需要分情况讨论,当只有当前线程对指定记录使用共享锁时,线程是可对该记录进行写入操作(包括更新与删除),这是由于在写入操作前,线程向该记录申请了排他锁,然后才进行写入操作;当其他线程也对该记录使用共享锁时,则不可进行写入操作,系统会有报错提示。不对锁定记录使用共享锁的线程,当然是不可进行写入操作了,写入操作会阻塞。
3. 使用共享锁进程可再次对锁定记录申请共享锁,系统并不报错,但是操作本身并没有太大意义。其他线程同样也可以对锁定记录申请共享锁。
4. 使用共享锁进程可对其锁定记录申请排他锁;而其他进程是不可以对锁定记录申请排他锁,申请会阻塞。
排他锁:
用法: SELECT ... FOR UPDATE;
MySQL会对查询结果集中每行都添加排他锁,在事物操作中,任何对记录的更新与删除操作会自动加上排他锁。
锁申请前提:当前没有线程对该结果集中的任何行使用排他锁或共享锁,否则申请会阻塞。
操作限制:
使用排他锁线程与不使用排他锁线程对锁定记录操作限制表
线程 读取操作 写入操作 共享锁申请 排他锁申请
使用排他锁 可读(新版本) 可写 可申请 可申请
不使用排他锁 可读(旧版本) 不可写(阻塞) 不可申请(阻塞) 不可申请(阻塞)
1. 使用排他锁线程可以对其锁定记录进行读取,读取的内容为当前事物的最新版本;而对于不使用排他锁的线程,同样是可以进行读取操作,这种特性是一致性非锁定读。即对于同一条记录,数据库记录多个版本,在事物内的更新操作会反映到新版本中,而旧版本会提供给其他线程进行读取操作。
2. 使用排他锁线程可对其锁定记录进行写入操作;对于不使用排他锁的线程,对锁定记录的写操作是不允许的,请求会阻塞。
3. 使用排他锁进程可对其锁定记录申请共享锁,但是申请共享锁之后,线程并不会释放原先的排他锁,因此该记录对外表现出排他锁的性质;其他线程是不可对已锁定记录申请共享锁,请求会阻塞。
4. 使用排他锁进程可对其锁定记录申请排他锁(实际上并没有任何意义);而其他进程是不可对锁定记录申请排他锁,申请会阻塞。
分享到:
相关推荐
MySQL数据库管理系统提供了多种锁机制,包括行级锁、表级锁和页级锁,这些锁的使用和理解对于优化并发性能和避免死锁至关重要。 1. 行级锁(Row-Level Locking) 行级锁是MySQL中最细粒度的锁,它只锁定操作的特定...
FOR UPDATE`语句就是一种行级锁的用法,用于在更新数据前锁定选定的行,防止其他事务在此期间对这些行进行修改。当在查询条件中明确指定了主键,并且查询能够匹配到具体行时,InnoDB会实施行锁。例如: ```sql ...
例如,MySQL的InnoDB存储引擎支持行级锁。 了解这些锁的原理和应用场景对于编写高并发、高性能的程序至关重要。正确选择和使用锁能够防止数据不一致,避免死锁,并优化系统的并发处理能力。在实际开发中,应根据...
MySQL提供了多种方法来查看锁的信息,以便于管理和调试。 - **通过传统的`SHOW ENGINE STATUS`命令**:可以查看特定存储引擎的状态信息,包括锁的情况。 - **通过`INFORMATION_SCHEMA`**:可以查询`INFORMATION_...
总结来说,MySQL的行级锁提供了细粒度的锁定,有助于提高并发性能,但同时也需要开发者合理使用,以防止出现死锁。理解锁的类型、正确使用事务和锁,以及掌握死锁预防和解决策略,是数据库管理和优化的关键。通过...
MySQL的锁分为表级锁、页级锁与行级锁。表级锁是MySQL中粒度大的一种锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。常使用的MYISAM与INNODB都支持表级锁定。 表级锁定分为两类,读锁与写锁。读锁是预期...
页级:引擎 BDB。表级:引擎 MyISAM , 理解为锁住整个表,可以同时读,写不行行级:引擎 INNODB , 单独的一行记录加锁 表级,直接锁定整张表,在你锁定期间,其它...对WRITE,MySQL使用的表锁定方法原理如下:如果在表
本文实例讲述了MySQL锁机制与用法。分享给大家供大家参考,具体如下: MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁;BDB存储引擎采用的是...
本文主要探讨了三种常见的分布式锁实现方式,包括基于Redis、MySQL以及Zookeeper的实现方法。 **基于Redis实现分布式锁** Redis是一个内存数据库,其命令执行是单线程的,这使得它非常适合用来实现分布式锁。Redis...
下面我们将详细探讨MySQL中的锁机制以及Java如何与之协同工作。 **MySQL中的锁** MySQL数据库提供了多种锁机制来确保数据的一致性和完整性,主要分为两大类:行级锁和表级锁。 1. **行级锁**:这种类型的锁只锁定...
考虑使用读写分离、行级锁或使用更宽松的隔离级别(如可重复读或读已提交)来降低锁冲突。 6. **监控与报警**: 定期监控数据库状态,设置报警机制,当检测到过多的锁定时,可以及时采取措施。例如,可以使用MySQL...
文章还探讨了死锁产生的原因以及MySQL如何自动检测和解决死锁的方法,并给出了多种锁优化策略,包括选择合适隔离级别、使用乐观锁、调整锁粒度等。最后,通过实际案例讲述了如何在高并发环境中有效应用事务和锁,...
**InnoDB行级锁的操作方法**: - 在`SELECT`语句中,可以通过`LOCK IN SHARE MODE`为符合条件的记录加共享锁。 - 在`SELECT`语句中,也可以通过`FOR UPDATE`为符合条件的记录加排他锁。 - 对于`INSERT`、`UPDATE`和`...
MySQL的InnoDB存储引擎提供了多种类型的锁来解决并发问题,主要包括行级锁、共享锁、排他锁等。这些锁机制可以帮助我们在高并发环境下维护数据的一致性。 1. **行级锁**:锁定特定的行数据,是最细粒度的锁。它允许...
MySQL 中有表级锁、行级锁和页面锁三种锁。表级锁开销小,加锁快,锁定粒度大,发生锁冲突的概率最高,并发度最低。行级锁开销大,加锁慢,锁定粒度最小,发生锁冲突的概率最低,并发度也最高。页面锁的开销和加锁...
同时,还会涉及锁定机制,包括行级锁、页级锁和表级锁,以确保在多用户环境下的数据一致性。 性能优化是MySQL的一大亮点。手册会提供关于查询优化的技巧,包括编写高效的SQL语句、使用EXPLAIN分析查询执行计划、...