`
747017186
  • 浏览: 327368 次
社区版块
存档分类
最新评论

mysql共享锁与排他锁

 
阅读更多

来源:https://www.cnblogs.com/boblogsbo/p/5602122.html

 

mysql锁机制分为表级锁和行级锁,本文就和大家分享一下我对mysql中行级锁中的共享锁与排他锁进行分享交流。

共享锁又称为读锁,简称S锁,顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。

排他锁又称为写锁,简称X锁,顾名思义,排他锁就是不能与其他所并存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据就行读取和修改。

对于共享锁大家可能很好理解,就是多个事务只能读数据不能改数据,对于排他锁大家的理解可能就有些差别,我当初就犯了一个错误,以为排他锁锁住一行数据后,其他事务就不能读取和修改该行数据,其实不是这样的。排他锁指的是一个事务在一行数据加上排他锁后,其他事务不能再在其上加其他的锁。mysql InnoDB引擎默认的修改数据语句,update,delete,insert都会自动给涉及到的数据加上排他锁,select语句默认不会加任何锁类型,如果加排他锁可以使用select ...for update语句,加共享锁可以使用select ... lock in share mode语句。所以加过排他锁的数据行在其他事务种是不能修改数据的,也不能通过for update和lock in share mode锁的方式查询数据,但可以直接通过select ...from...查询数据,因为普通查询没有任何锁机制。

说了这么多,咱们来看下以下简单的例子:

我们有如下测试数据

现在我们对id=1的数据行排他查询,这里会使用begin开启事务,而不会看见我关闭事务,这样做是用来测试,因为提交事务或回滚事务就会释放锁。

打开一个查询窗口

会查询到一条数据,现在打开另一个查询窗口,对同一数据分别使用排他查和共享锁查询两种方式查询

排他查

共享查

我们看到开了排他锁查询和共享锁查询都会处于阻塞状态,因为id=1的数据已经被加上了排他锁,此处阻塞是等待排他锁释放。

如果我们直接使用以下查询呢

 

我们看到是可以查询到数据的。

我们再看一下一个事务获取了共享锁,在其他查询中也只能加共享锁或不加锁。

 我们看到是可以查询数据的,但加排他锁就查不到,因为排他锁与共享锁不能存在同一数据上。

最后我们验证下上面说的mysql InnoDb引擎中update,delete,insert语句自动加排他锁的问题

 

 

此时共享查询处于阻塞,等待排它锁的释放,但是用普通查询能查到数据,因为没用上锁机制不与排他锁互斥,但查到的数据是修改数据之前的老数据。

然后我们提交数据,释放排他锁看下修改后的数据,此时可用排他查,共享查和普通查询, 因为事务提交后该行数据释放排他锁,下面就只显示普通查询,其他的同学们自己去验证。

 可以看到结果与预期的一样。

以上为我对mysql中共享锁与排他锁的个人理解,有不正确的地方还希望各位指正。

分享到:
评论

相关推荐

    MySQL8.0锁机制和事务

    MySQL 8.0 中的锁机制可以分为共享锁和排他锁两大类。共享锁(S)允许拥有共享锁的事务读取该行数据,而排他锁(X)允许拥有排他锁的事务修改或删除该行数据。此外,InnoDB 存储引擎还支持意图锁,意图锁是表级锁,...

    并发编程下的锁机制,乐观锁、悲观锁、共享锁、排他锁、分布式锁、锁降级原理篇

    排他锁与共享锁相反,它不允许其他线程同时读取或写入数据。在SQL中,`SELECT ... FOR UPDATE`也可以用来获取排他锁,确保在修改数据时没有其他线程干扰。这种方式保障了数据的一致性,但并发性较低。 4. **乐观锁...

    数据库锁(行锁,表锁,共享锁,排他锁)脏读、不可重复读、幻读和事物隔离级别

    在MySQL的InnoDB引擎中,支持行级锁(Row Locks)、表级锁(Table Locks),以及共享锁(Shared Locks)和排他锁(Exclusive Locks)。行级锁通过索引实现,如果SQL语句没有利用索引,则会升级为表锁。 行锁具有...

    MySQL的锁机制解析

    - **共享锁(Shared Locks)**:允许读取一行数据,但不允许修改,与其他共享锁并存。 - **排他锁(Exclusive Locks)**:允许读取和修改一行数据,阻止其他事务获取任何类型的锁。 - **Next-Key Locks(行锁+...

    MySQL锁详细介绍

    MySQL中的锁大致可以分为两大类:从数据库系统的角度,包括独占锁(排他锁)、共享锁、更新锁以及各种类型的意向锁;从锁的作用范围,可以分为行级锁、表级锁和页级锁等。下面我们将详细讨论这些锁的特性。 1. **...

    Mysql 锁机制的详细说明

    - MySQL 的共享锁和排他锁就是悲观锁的实现。 2. 乐观锁: - 假设不会发生冲突,只有在更新数据时检查是否被其他事务修改。 - 通常通过版本号或时间戳实现,MySQL 中没有内置的乐观锁,但可以在应用层面实现。 ...

    MySQL锁模型与事物

    首先,我们要了解MySQL中的两种主要锁类型:共享锁(Shared Locks)和排他锁(Exclusive Locks)。共享锁允许一个事务读取一行,而排他锁则允许事务对行进行读写操作。当一个事务持有共享锁时,其他事务可以再获取...

    MySQL 全局锁、表级锁、行级锁

    - 表级锁是一种粒度较大的锁,它锁定的是整个表,分为读锁(共享锁)和写锁(排他锁)。 - 读锁(`SELECT ... LOCK IN SHARE MODE`)允许多个事务同时读取同一张表,但不允许写入。 - 写锁(`SELECT ... FOR ...

    mysql 悲观锁与乐观锁的理解及应用分析

    不要把他们与mysql中提供的锁机制(表锁,行锁,排他锁,共享锁)混为一谈。 一、悲观锁 顾名思义,就是对于数据的处理持悲观态度,总认为会发生并发冲突,获取和修改数据时,别人会修改数据。所以在整个数据处理过程...

    MySQL锁的详细介绍

    在 InnoDB 引擎中,我们可以使用行锁和表锁,其中行锁又分为共享锁和排他锁。 * Record Lock 锁:锁定单个行记录的锁。 * Gap Lock 锁:间隙锁,锁定索引记录间隙,确保索引记录的间隙不变。 * Next-key Lock 锁:...

    【课堂笔记】MySQL事务与锁详解.pdf

    - 按锁的级别分为:共享锁和排他锁。 - 按加锁的方式分为:乐观锁和悲观锁。 4. 行锁的原理与算法: 行锁是指只对数据库表中某一行记录加锁,MySQL中InnoDB存储引擎支持行锁,其目的是减少锁冲突,提高并发性。行锁...

    Mysql 锁机制笔记1

    在MyISAM中,锁有两种模式——共享锁(读锁)和排他锁(写锁)。读锁允许其他事务读取数据,但阻止写操作;写锁则阻止其他事务的读写操作。MyISAM在执行SQL时会自动为SELECT加上共享锁,为UPDATE、DELETE等操作加上...

    MySQL与Java锁的学习

    - **共享锁(S锁)**:也称为读锁,允许一个或多个事务读取一行,但不允许写入。 - **排他锁(X锁)**:也称为写锁,允许一个事务独占一行,阻止其他事务的读写操作。 2. **表级锁**:锁定整个表,限制了并发性能...

    mysql数据库锁+优化.pdf

    - **共享锁(读锁)**: 共享锁允许多个事务对同一数据进行读取,这些读取操作不会互相阻塞。在SQL中,可以使用`SELECT ... LOCK IN SHARE MODE`来获取共享锁。这种锁防止了写锁的获取,因此在同一时间,其他事务...

    深入理解Mysql锁与事务隔离级别1

    悲观锁又分为读锁(共享锁)和写锁(排他锁): - 共享锁(读锁):允许多个读操作同时进行,但阻止任何写操作。 - 排他锁(写锁):在写操作未完成前,会阻止其他写锁和读锁。 此外,根据锁定的粒度,锁还可以...

Global site tag (gtag.js) - Google Analytics