跳至主要內容
深入理解 SELECT ... FOR UPDATE:确保数据库并发操作的一致性

引言

在多用户、高并发的Web应用和分布式系统中,确保数据库操作的一致性和完整性是至关重要的。当多个事务同时尝试修改同一数据时,可能会导致数据不一致、脏读、不可重复读或幻读等问题。为了应对这些挑战,SQL 提供了 SELECT ... FOR UPDATE 语句,它可以在查询的同时锁定所选的行,防止其他事务对其进行修改,直到当前事务提交或回滚。
本文将深入探讨 SELECT ... FOR UPDATE 的工作原理、使用场景、最佳实践以及潜在的风险,并通过实际案例帮助读者更好地理解和应用这一功能。


zheng大约 14 分钟数据库mysql
联合索引问题

联合索引(Composite Index)是数据库中一种重要的索引类型,它允许基于多个列的组合来加速查询。理解联合索引的实现原理有助于优化查询性能和设计高效的数据库结构。以下是关于联合索引实现原理的详细解释:

1. 联合索引的结构

联合索引本质上是一个B+树(或类似的平衡树结构),其中每个节点存储的是多个列的组合值。假设你有一个联合索引 ABC,那么索引树的结构是基于列 ABC 的组合值来排序的。


zheng大约 9 分钟数据库mysql
BigKey问题

BigKey 问题是指在 Redis 中某些键包含的数据量过大,导致这些键的操作(如读取、写入、删除等)消耗过多的内存和CPU资源,进而影响整个Redis实例的性能。解决 BigKey 问题的关键在于识别并优化这些大键,以提高系统的稳定性和响应速度。以下是几种常见的解决方法:

1. 识别 BigKey

使用 redis-cli 工具

  • MEMORY USAGE 命令:可以用来查看某个键占用的内存量。
    redis-cli --raw MEMORY USAGE <key>
    
  • SCAN 命令:结合 MEMORY USAGE 可以批量扫描并检查多个键的大小。
    redis-cli --bigkeys
    

zheng大约 4 分钟数据库redis
跳表

跳表(Skip List)是一种数据结构,旨在提供高效的插入、删除和查找操作,同时保持相对简单的实现。它结合了链表和二叉搜索树的优点,通过引入多级索引来加速查找过程。跳表最早由William Pugh在1989年提出,并因其高效性和易于实现而被广泛应用于各种场景,尤其是在分布式系统和内存数据库中。

1. 基本概念

跳表本质上是一个多层链表,每一层都是对下一层的“抽样”或“稀疏表示”。最底层(通常称为第0层)包含所有元素,按升序排列。每一层之上的层则只包含一部分元素,形成一个稀疏的索引。随着层数的增加,每一层的元素数量逐渐减少,直到最顶层可能只有少数几个元素。


zheng大约 5 分钟数据库数据库
mysql的死锁

1. 死锁的概念

死锁是指两个或多个事务互相等待对方释放资源,导致所有事务都无法继续执行的情况。每个事务都在等待其他事务持有的锁,形成一个循环依赖,从而导致系统无法继续前进。

2. 死锁的原因

死锁通常发生在并发事务之间争夺资源时,特别是在以下情况下:

  • 多个事务以不同的顺序锁定相同的资源:例如,事务A先锁定了表T1,然后尝试锁定表T2;而事务B先锁定了表T2,然后尝试锁定表T1。如果两个事务同时进行,可能会形成死锁。

  • 长时间持有锁:如果一个事务长时间持有锁而不释放,可能会导致其他事务等待过久,增加死锁的可能性。

  • 嵌套锁:当一个事务在一个事务内部又启动了另一个事务(嵌套事务),并且这两个事务都持有了不同的锁,可能会导致死锁。

  • 索引覆盖不全:如果查询没有使用合适的索引,可能会导致更多的行被锁定,增加了死锁的风险。

  • 隐式锁:某些操作(如SELECT ... FOR UPDATE)会隐式地获取行级锁,如果没有正确管理这些锁,可能会引发死锁。


zheng大约 7 分钟数据库mysql
mysql 数据安全的“双1模式”

mysql数据安全的“双1模式”是指通过两种关键机制来确保数据的安全性和可靠性:二进制日志(Binary Log)重做日志(Redo Log)。这两种日志共同作用,提供了强大的数据保护和恢复能力。以下是关于“双1模式”的总结:
mysql的双1策略指的是这两个参数的值都是1

sync_binlog=1;
innodb_flush_log_at_trx_commit=1;

zheng大约 8 分钟数据库mysql
mysql回滚日志(undo log)

mysql的回滚日志(Undo Log)是InnoDB存储引擎中用于支持事务的ACID特性、实现多版本并发控制(MVCC)以及提供回滚功能的重要组成部分。以下是关于mysql回滚日志的关键点总结:

1. 作用

  • 事务回滚:如果一个事务在执行过程中遇到错误或被用户显式地回滚,Undo Log可以用来撤销该事务对数据库所做的所有更改。
  • 多版本并发控制(MVCC):通过保存旧版本的数据,Undo Log允许不同事务看到数据的不同快照,从而实现非锁定读取(例如SELECT语句不会被写操作阻塞),提高并发性能。

zheng大约 4 分钟数据库mysql
mysql重做日志(redo log)

mysql的重做日志(Redo Log)是InnoDB存储引擎中用于实现事务持久性和崩溃恢复的重要机制。以下是关于mysql重做日志的关键点总结:

1. 作用

  • 事务持久性:确保即使在系统崩溃的情况下,已经提交的事务也不会丢失。通过记录事务对数据库所做的物理更改,重做日志使得这些更改可以在系统重启时被重新应用。
  • 崩溃恢复:当mysql实例非正常关闭后重启时,可以通过重做日志恢复未完成的事务,保证数据的一致性和完整性。

zheng大约 4 分钟数据库mysql
Milvus向量数据库之以图搜图

一、介绍

Milvus 创建于 2019 年,其目标只有一个:存储、索引和管理由深度神经网络和其他机器学习 (ML) 模型生成的大量嵌入向量。
作为专门设计用于处理对输入向量的查询的数据库,它能够以万亿级对向量进行索引。与现有关系数据库主要按照预定义模式处理结构化数据不同,Milvus 是自下而上设计的,用于处理从非结构化数据转换的嵌入向量。

随着互联网的发展和发展,非结构化数据变得越来越普遍,包括电子邮件、论文、物联网传感器数据、Facebook 照片、蛋白质结构等等。为了使计算机理解和处理非结构化数据,使用嵌入技术将这些数据转换为向量。Milvus 存储并索引这些向量。Milvus 能够通过计算两个向量的相似距离来分析它们之间的相关性。如果两个嵌入向量非常相似,则意味着原始数据源也相似。
img
来源:
https://milvus.io/docs/v2.1.x/overview.md


zheng大约 7 分钟数据库向量数据库Milvus
2
3