为什么MySQL不允许对同一张表同时进行查询和更新?

为什么MySQL不允许对同一张表同时进行查询和更新?

问题

下面这个看起来没有问题的SQL语句却运行不了

UPDATE `tb1` AS outer_tb1 SET cnt = (
	SELECT count(*) FROM `tb1`	AS inner_tb1 
    WHERE inner_tb1.type = outer_tb1.type
);

在这里插入图片描述

如果清楚MySQL是如何执行查询的,就知道为什么会这样子了。

因为执行SELECT count(*) FROM tb1 AS inner_tb1 WHERE inner_tb1.type = outer_tb1.type的时候会获得读锁(共享锁),一旦数据表被加上读锁,其他请求可以对该表再次增加读锁,但是不能增加写锁。(当一个请求在读数据时,其他请求也可以读,但是不能写,因为一旦另外一个线程写了数据,就会导致当前线程读取到的数据不是最新的了。这就是不可重复读现象)

解决

可以通过使用生成表的形式来绕过这种限制,因为MySQL只会把这个表当作一个临时表来处理。

UPDATE `tb1` INNER JOIN( 
    SELECT type,count(*) AS cnt FROM `tb1`	
    GROUP BY type
) AS outer_tb1 USING(type)
SET tb1.cnt = outer_tb1.cnt;
  • 6
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: MySQL 会锁是因为在执行某些操作需要保证数据的一致性和完整性。这就意味着在一个事务中对的修改操作需要暂阻止其他事务对的访问或修改,以避免并发冲突。 MySQL 支持多种类型的锁,包括共享锁(S锁)和排他锁(X锁)。共享锁允许多个事务并发访问,但不能修改数据。排他锁则禁止其他事务对进行任何访问,直到该锁被释放。 通常情况下,MySQL 会在执行以下操作: - 使用 `SELECT … FOR UPDATE` 或 `SELECT … LOCK IN SHARE MODE` 语句查询数据。 - 使用 `INSERT`、`UPDATE` 或 `DELETE` 语句修改数据。 - 使用 `ALTER TABLE` 语句修改结构。 - 使用 `TRUNCATE TABLE` 语句清空数据。 另外,MySQL 还支持手动加锁的功能,可以使用 `GET_LOCK()` 和 `RELEASE_LOCK()` 函数来获取和释放锁。 常见的锁策略包括: - 行锁:在修改行数据加锁,锁定的是特定的行。 - 页锁:在修改页数据加锁,锁定的是特定的页。 - 锁:在修 ### 回答2: MySQL会对进行锁定的原因有多种,主要包括以下几个方面: 1. 数据库事务:MySQL中的事务是一组对数据库操作的逻辑单元,保证了数据的一致性和完整性。在事务执行期间,MySQL会为被操作的数据加上锁定,以确保数据的一致性。 2. 并发处理:当多个用户同对同一个进行读写操作,可能会引发数据的不一致性。为了避免这种情况发生,MySQL会对进行锁定,以保证操作的原子性。 3. 数据库备份和恢复:在进行数据库备份和恢复MySQL需要确保备份数据的一致性。为了防止其他用户对备份数据的修改,MySQL会对备份涉及的进行锁定。 4. 数据库优化和索引:MySQL进行数据库优化和索引构建,需要对进行锁定以避免数据的修改和删除。这样可以保证优化的准确性和索引的正确性。 总的来说,MySQL进行锁定是为了保证并发操作的数据一致性和完整性,防止数据的不一致和损坏。同,锁定也是为了在数据库的备份、恢复、优化和索引构建过程中保证数据的正确性和完整性。 ### 回答3: MySQL中,锁是一种数据库锁定机制,用于控制对数据的并发访问。 MySQL之所以会锁,主要原因如下: 1. 保持数据的一致性:为了保证数据的完整性和一致性,MySQL在执行修改操作,会对涉及的进行锁定,防止其他并发操作对数据产生干扰。例如,当有一个事务正在对某张进行更新操作,不希望其他事务同对该进行读取或写入,以免出现脏读、不可重复读等问题。 2. 避免冲突:当多个事务同对同一张进行写操作,可能会导致数据冲突,为了避免这种情况的发生,MySQL采用锁机制来保证事务的隔离性,每个事务在访问之前都需要获取相应的锁,只有获得锁的事务才能对进行修改操作,其他事务需要等待锁的释放。 3. 提高并发性能:MySQL采用锁的方式可以减少一些锁粒更小的并发冲突,锁定整个可以减少锁的竞争和开销,从而提高数据库的并发性能。 需要注意的是,MySQL锁是粗粒锁,并发操作较多的场景下,锁可能导致其他事务的等待间较长,影响系统性能,因此在设计数据,需要综合考虑并发访问的策略和业务需求,适当选择合适的锁机制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值