请说一下MySQL的共享锁和排他锁

文摘   2025-01-07 07:38   天津  

 

共享锁(Shared Lock)

共享锁,也被称为读锁(Read Lock),它允许多个事务同时对同一数据资源进行读取操作,但不允许任何事务对数据进行修改。

换句话说,共享锁保证了数据的共享读特性。

特点

  1. 1. 共享性:多个事务可以同时持有相同的共享锁,并发读取数据。
  2. 2. 不阻塞其他共享锁:一个事务持有共享锁不会阻止其他事务获取相同的共享锁。
  3. 3. 阻塞独占锁(排他锁):如果一个事务已经持有了共享锁,其他事务如果要获取排他锁,则需要等待共享锁释放。

使用场景

共享锁主要应用在需要同时读取同一数据资源的场景,如一致性读取和长时间读取操作。

通过共享锁,可以确保数据在读取过程中不会被其他事务修改。

示例

假设我们有一个用户表 users,现在我们要在事务中读取某个用户的信息,并确保在事务结束之前,这条记录不会被其他事务修改。

START TRANSACTION;
SELECT * FROM users WHERE id=1 LOCK IN SHARE MODE;

在这个例子中,LOCK IN SHARE MODE 子句会对 id=1 的行加上共享锁,其他事务可以读取这行数据,但无法对其进行更新或删除。

排他锁(Exclusive Lock)

排他锁,也被称为写锁(Write Lock),它允许事务对记录进行修改操作时,防止其他事务同时读取或修改这些记录。

排他锁保证了数据的独占性。

特点

  1. 1. 独占性:只能有一个事务持有排他锁,其他事务无法获取同样的记录上的排他锁。
  2. 2. 阻止其他事务获取任何锁:如果一个事务已经持有了排他锁,其他事务无法获取共享锁或排他锁。
  3. 3. 事务级隔离:事务持有排他锁的记录只对持有该锁的事务可见,其他事务不能访问。

使用场景

排他锁主要应用于需要修改数据的场景,如插入、更新和删除操作。

通过排他锁,可以确保数据在修改过程中不会被其他事务读取或修改,从而避免数据不一致的问题。

示例

假设我们需要更新某个用户的信息,并希望在事务期间确保其他事务不能读取或修改该数据。

START TRANSACTION;
SELECT * FROM users WHERE id=2 FOR UPDATE;

在这个例子中,FOR UPDATE 子句会对 id=2 的行加上排他锁。

在事务提交之前,其他事务无法读取或修改这行数据。

小结

共享锁和排他锁是MySQL中用于控制并发访问的基本锁类型。

通过合理地使用锁,可以有效地管理并发事务,提高系统的稳定性和效率。

  • • 共享锁:允许并发读取,但不允许修改。

适用于读取操作。

  • • 排他锁:允许独占访问,既不允许读取也不允许修改。

适用于写入操作。

在实际开发中,根据具体业务需求选择合适的锁类型,可以确保数据的一致性和完整性。

 



坚持每日更新,希望能够带来技术上的一点收获。也希望大家能够点赞收藏转发。你的支持,是我持续编写的最大动力!  

你诺喜欢,请点个关注

夏壹分享
系统化技术讲解,每日精进,为后端技术人员打造的知识充电站!
 最新文章