delete、update对表的锁定

delete语句对表的锁定#

在 MySQL 中,DELETE 语句在执行时确实会对表进行锁定,以确保数据的一致性和完整性。具体来说,DELETE 语句会使用行级锁或表级锁,这取决于存储引擎和事务隔离级别。以下是一些关键点:

InnoDB:使用行级锁,不会阻止其他事务插入新行,只要这些新行不满足 WHERE 条件。

锁机制#

  1. InnoDB 存储引擎

    • 行级锁:InnoDB 默认使用行级锁。当执行 DELETE 语句时,InnoDB 会锁定符合 WHERE 条件的行。这意味着其他事务可以继续插入新行,只要这些新行不满足 WHERE 条件。
    • 间隙锁:为了防止幻读,InnoDB 可能会使用间隙锁(Gap Locks)或临键锁(Next-Key Locks)。这些锁会锁定索引范围,防止其他事务在这些范围内插入新行。
  2. MyISAM 存储引擎

    • 表级锁:MyISAM 使用表级锁。当执行 DELETE 语句时,整个表会被锁定,阻止其他事务对表进行任何写操作(包括插入、更新和删除)。

EXPLAIN 输出解析#

1	DELETE	trackinformation		range	idx_timestamp	idx_timestamp	9	const	229675	100.00	Using where
  • type: range — 表示使用了索引范围扫描。
  • key: idx_timestamp — 表示实际使用的索引。
  • rows: 229675 — 表示估计需要扫描的行数。
  • Extra: Using where — 表示使用了 WHERE 子句进行过滤。

锁的影响#

  • 行级锁:如果使用 InnoDB 存储引擎,DELETE 语句只会锁定符合 WHERE 条件的行。其他事务可以继续插入新行,只要这些新行不满足 WHERE 条件。
  • 表级锁:如果使用 MyISAM 存储引擎,DELETE 语句会锁定整个表,阻止其他事务插入新行。

分批删除#

为了减少锁的持有时间和对其他事务的影响,可以使用分批删除的方法。这不仅可以减少锁的持有时间,还可以避免一次性删除大量数据导致的性能问题。

SET @batch_size = 10000;

REPEAT
    DELETE FROM trackinformation
    WHERE timestamp < 1730690061000
    LIMIT @batch_size;
UNTIL ROW_COUNT() < @batch_size END REPEAT;

事务管理#

在高并发环境中,可以考虑使用事务来管理删除操作,以确保数据的一致性和减少锁的持有时间。

START TRANSACTION;

SET @batch_size = 10000;

REPEAT
    DELETE FROM trackinformation
    WHERE timestamp < 1730690061000
    LIMIT @batch_size;
UNTIL ROW_COUNT() < @batch_size END REPEAT;

COMMIT;

总结#

  • 锁机制DELETE 语句会根据存储引擎的不同使用行级锁或表级锁。
  • InnoDB:使用行级锁,不会阻止其他事务插入新行,只要这些新行不满足 WHERE 条件。
  • MyISAM:使用表级锁,会阻止其他事务插入新行。
  • 分批删除:推荐使用分批删除的方法,以减少锁的持有时间和对其他事务的影响。

希望这些信息对您有帮助!如果有更多问题,请随时提问。

UPDATE 语句的锁定行为#

在 MySQL 中,UPDATE 语句的锁定行为取决于所使用的存储引擎和事务隔离级别。以下是一些关键点,帮助您理解 UPDATE 语句在不同存储引擎下的锁定行为:

1. InnoDB 存储引擎#

InnoDB 是 MySQL 的默认存储引擎,支持行级锁和事务。UPDATE 语句在 InnoDB 中的行为如下:

  • 行级锁:InnoDB 会在 UPDATE 语句中锁定被修改的行。这意味着其他事务可以继续插入新行,只要这些新行不满足 UPDATE 语句的 WHERE 条件。
  • 间隙锁:为了防止幻读,InnoDB 可能会使用间隙锁(Gap Locks)或临键锁(Next-Key Locks)。这些锁会锁定索引范围,防止其他事务在这些范围内插入新行。

2. MyISAM 存储引擎#

MyISAM 存储引擎使用表级锁。UPDATE 语句在 MyISAM 中的行为如下:

  • 表级锁UPDATE 语句会锁定整个表,阻止其他事务对表进行任何写操作(包括插入、更新和删除)。

事务隔离级别#

事务隔离级别也会影响锁定行为:

  • 读未提交(Read Uncommitted):最低的隔离级别,几乎不使用行锁,允许脏读。
  • 读已提交(Read Committed):每个事务可以看到其他事务已经提交的更改,但不会看到未提交的更改。
  • 可重复读(Repeatable Read):InnoDB 的默认隔离级别,保证在一个事务中多次读取同一数据时结果一致,使用行级锁和间隙锁。
  • 可串行化(Serializable):最高的隔离级别,使用表级锁,确保事务完全隔离。

示例#

假设您使用 InnoDB 存储引擎,并且事务隔离级别为 Repeatable Read,以下是一个 UPDATE 语句的示例:

UPDATE trackinformation
SET some_column = some_value
WHERE timestamp < 1730690061000;

在这个例子中,InnoDB 会锁定所有满足 WHERE 条件的行,但不会锁定整个表。其他事务可以继续插入新行,只要这些新行不满足 WHERE 条件。

分批更新#

为了减少锁的持有时间和对其他事务的影响,可以使用分批更新的方法:

SET @batch_size = 10000;

REPEAT
    UPDATE trackinformation
    SET some_column = some_value
    WHERE timestamp < 1730690061000
    LIMIT @batch_size;
UNTIL ROW_COUNT() < @batch_size END REPEAT;

事务管理#

在高并发环境中,可以考虑使用事务来管理更新操作,以确保数据的一致性和减少锁的持有时间:

START TRANSACTION;

SET @batch_size = 10000;

REPEAT
    UPDATE trackinformation
    SET some_column = some_value
    WHERE timestamp < 1730690061000
    LIMIT @batch_size;
UNTIL ROW_COUNT() < @batch_size END REPEAT;

COMMIT;

总结#

  • InnoDBUPDATE 语句使用行级锁,不会锁定整个表,允许其他事务插入新行。
  • MyISAMUPDATE 语句使用表级锁,会锁定整个表,阻止其他事务插入新行。
  • 分批更新:推荐使用分批更新的方法,以减少锁的持有时间和对其他事务的影响。

希望这些信息对您有帮助!如果有更多问题,请随时提问。

作者:Esofar

出处:https://www.cnblogs.com/firsthelloworld/p/18532187

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   我不想学编丿程  阅读(313)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示