mysql 的锁有那些呢

MySQL 中常见的锁类型有以下几种:

  1. 共享锁(Shared Lock),简称 S 锁,也叫读锁。多个事务可以同时持有共享锁,并发读取同一数据并不会阻塞。

  2. 排他锁(Exclusive Lock),简称 X 锁,也叫写锁。一个事务持有排他锁后,其他事务不能再获取该数据的任何锁,包括共享锁和排他锁。因此,排他锁是用于防止并发修改的。

  3. 意向共享锁(Intention Share Lock),简称 IS 锁,是辅助作用的锁。事务在要获取共享锁前,会先尝试获取意向共享锁,表示事务准备获取一些共享锁。

  4. 意向排他锁(Intention Exclusive Lock),简称 IX 锁,也是辅助作用的锁。事务在要获取排他锁前,会先尝试获取意向排他锁,表示事务准备获取一些排他锁。

  5. 自增锁(AUTO-INC Locks),是一种特殊的表锁。在执行插入操作时,如果使用了自增列,会有一些特殊的自增锁机制来保证没有两个事务使用相同的自增值。

  6. 行锁(Row Lock),是一种针对行级别数据的锁。在使用 InnoDB 存储引擎的时候,MySQL 会自动将锁定粒度缩小到行级别,因此 InnoDB 存储引擎可以对单个数据行加锁。

  7. 表锁(Table Lock),是一种针对整张表的锁。如果事务要对整张表进行操作,会自动升级为表锁。表锁无论哪个事务获取后,都会阻塞其他的事务。

这些锁都是InnoDB存储引擎中的锁。MySQL中有多种存储引擎,每种存储引擎对锁的实现可能略有不同。但是,InnoDB是MySQL官方推荐使用的存储引擎,因此在实际应用中,大多数情况下使用的都是InnoDB引擎中的锁。

意向共享锁(Intention Shared Lock)是一种针对表级别锁的概念,它是由InnoDB存储引擎提出来的。它的作用是协调事务对表中数据的锁定,保证并发事务之间的一致性。

简单来说,意向共享锁是在事务对表某一行或某些行加共享锁之前,事务会首先向该表申请一个“意向共享锁”。意向共享锁的存在告诉其他事务,在这个表上加“共享锁”时,只需要向这个表的“意向共享锁”发起请求即可,不需要对每一行都进行申请。这样,可以大大提高了并发性能,避免了多个事务重复争用锁的情况。

需要注意的是,意向共享锁并不是直接作用于表上的,而是作用于锁定表某一行或某些行使用的锁上。此外,意向共享锁只会阻塞其他事务想要获得排它锁的操作,而对其他并发操作不会产生影响。

意向排他锁(Intention Exclusive Lock)也是一种针对表级别锁的概念,它与意向共享锁一样,是由InnoDB存储引擎提出来的。它的作用是在事务对表某一行或某些行加排它锁之前,告诉其他事务,“我要对这些行加排它锁了”,从而避免其他事务对这些行加共享锁造成的冲突。

跟意向共享锁类似,意向排它锁也是锁定某一行或某些行使用的锁上。在事务需要对表中某一行或某些行加排它锁之前,它首先会向表申请意向排它锁。其他事务在发现表上的意向排它锁时,即可避免与当前事务形成冲突。

需要说明的是,对于一个事务来说,当它要对表中某一行或某些行加排它锁时,它需要获得该行(或多行)上的共享锁和意向排它锁。这么做是因为,如果一个事务在尝试申请意向排它锁时发现自己已经拥有了意向共享锁,而另一个事务又想要对该行加排它锁,那么这两个事务就会形成死锁。

综上所述,意向排它锁的作用是防止不同事务对同一行或同一部分数据产生竞争,保证所有事务之间的数据访问的可靠性和一致性。

在 MySQL 中,行锁和表锁是两种不同的锁机制。

如果一个 SELECT 查询是在不使用任何锁的情况下执行的,那么该查询不会产生行锁或表锁。

当一个 SELECT 查询使用了 WHERE 子句并且 WHERE 子句中的条件是基于索引列的,那么该查询很可能会产生行锁。行锁是针对表中的某一行的一个锁。

如果 SELECT 查询中使用了 FOR UPDATE 或者 FOR SHARE 语句(称为 SELECT … FOR UPDATE 和 SELECT … FOR SHARE),那么该查询将产生行级锁。

而当一个 SELECT 查询使用表锁(例如 LOCK TABLES)时,将获得一个表级锁,该查询将锁定整个表;而当使用 UNLOCK TABLES 语句时,将释放所有表级锁。

总之,当一个 SELECT 查询使用了 WHERE 子句并且 WHERE 子句中的条件基于索引列,那么该查询将很可能产生行锁。而对于那些在查询中使用了表锁的情况,该查询将会产生表锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值