讲之前,先唠点5毛钱的基础小知识。我们都知道 MySQL 有全局锁、表记锁和行级别锁,其中行级锁加锁规则比较复杂,不同的场景,加锁的形式还不同。
需要明确的是:对记录加锁时,加锁的基本单位是 next-key lock,它是由记录锁和间隙锁组合而成的,next-key lock 是前开后闭区间,而间隙锁是前开后开区间。而 next-key lock 在一些场景下会退化成记录锁或间隙锁。
前置概念
脏读
又称无效数据的读出,是指在数据库访问中,事务 T1 将某一值修改但是还未提交,然后事务 T2 读取该值,此后 T1 因为某种原因撤销对该值的修改并提交,这就导致了 T2 所读取到的数据是无效的,值得注意的是,脏读一般是针对于 update 操作的。
在 Mysql 中,无论是 Innodb 还是 MyISAM 引擎,都使用了 B + 树做索引结构 (这里先不考虑 Hash 索引)。那么我们从最普通的二叉树开始,从而说明 Mysql 为什么选择 B + 树作为索引结构。
索引这个词,相信大多数人已经相当熟悉了,很多人都知道 MySQL 的索引主要以 B + 树为主,但是要问到为什么用 B + 树,恐怕很少有人能把前因后果讲述的很完整。本文就来从头到尾介绍下数据库的索引。
在数据库查询中,多表查询是一项非常常见且重要的任务。它允许我们从多个相关联的表中检索和组合数据,以满足各种复杂的查询需求。在多表查询中,子查询是一种强大的工具,用于在查询中嵌套另一个查询。本文将深入探讨 MySQL 中的子查询,包括什么是子查询、如何编写子查询以及使用子查询解决的常见查询问题。
缓存穿透
问题描述
key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会压到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。
一、MySQL 的 For Update 简介
For update 是 MySQL 中用于实现行锁的一种语法,其主要作用是在 SELECT 查询语句中加上 FOR UPDATE 子句,以保证查询结果集中的每一行都被锁定,避免其他事务对这些行进行修改。具体语法如下:
前言
在分布式系统中,由于 redis 分布式锁相对于更简单和高效,成为了分布式锁的首先,被我们用到了很多实际业务场景当中。
但不是说用了 redis分布式锁,就可以高枕无忧了,如果没有用好或者用对,也会引来一些意想不到的问题。
前言
这里来了解一下,Redis 中常见的集群方案
几种常用的集群方案
- 主从集群模式
- 哨兵机制
- 切片集群 (分片集群)
事务是 MySQL 等关系型数据库区别于 NoSQL 的重要方面,是保证数据一致性的重要手段。本文将首先介绍 MySQL 事务相关的基础概念,然后介绍事务的 ACID 特性,并分析其实现原理。