1. Mysql有哪些存储引擎,默认的存储引擎是什么

存储引擎

事务支持

锁机制

外键支持

数据缓存

全文索引

场景推荐

InnoDB

行级锁

是(缓冲池)

默认推荐,适用于大多数业务场景

MyISAM

表级锁

否(仅缓存索引)

读多写少的静态表

Memory

表级锁

是(内存中)

临时数据、缓存

Archive

行级锁(只读)

日志、归档数据

CSV

表级锁

导出导入 CSV 文件

BLACKHOLE

表级锁

丢弃所有写入的数据

Federated

是(视远程引擎)

视情况而定

视情况而定

视情况而定

视情况而定

访问远程数据库表

NDB (Cluster)

行级锁

高可用集群环境


2. 什么是索引,有哪些作用,

在数据库中,索引(Index) 是一种用于 加速数据检索 的数据结构。它类似于书籍的目录,可以帮助数据库快速定位到符合条件的数据行,而不必扫描整个表。

作用

说明

1. 提高查询速度

对经常查询的字段建立索引,可以大幅减少磁盘 I/O 和 CPU 消耗

2. 加速连接操作

在多表关联时,对连接字段建立索引可显著提升性能

3. 确保唯一性约束

唯一索引(UNIQUE)确保某列或组合列的值在整个表中是唯一的

4. 支持排序和分组

如果排序或分组字段有索引,可以避免额外的排序操作

5. 优化查询计划

数据库优化器会根据索引选择最优执行路径

类型

描述

示例

主键索引(PRIMARY KEY)

唯一且非空,每个表只能有一个

id INT PRIMARY KEY

唯一索引(UNIQUE)

值必须唯一,但允许 NULL

CREATE UNIQUE INDEX idx_email ON users(email);

普通索引(INDEX)

最基本的索引类型,无唯一性限制

CREATE INDEX idx_name ON users(name);

全文索引(FULLTEXT)

用于全文搜索,适用于大文本字段

CREATE FULLTEXT INDEX idx_desc ON products(description);

联合索引(Composite Index)

多个字段组成的复合索引

CREATE INDEX idx_name_age ON users(name, age);

空间索引(SPATIAL)

用于地理空间数据类型

CREATE SPATIAL INDEX idx_geo ON locations(geo);


3. 一个表中应该有多少条索引。什么样的情况不应该添加索引

一、一个表中应该有多少条索引

  • 主键自动创建索引:每个表应有且仅有一个主键索引(聚簇索引)。

  • 频繁查询的字段:为经常出现在 WHEREJOINORDER BY 中的字段添加索引。

  • 外键字段:建议为外键字段添加索引以提升连接效率。

  • 联合索引优化多条件查询:如 (user_id, create_time)

二、哪些情况不应该添加索引?

以下情况添加索引不仅无效,还可能影响性能:

1. 数据区分度低的字段

  • 如性别(男/女)、状态(0/1)、枚举值较少的字段。

  • 索引命中率低,数据库可能会选择忽略索引直接扫描全表。


4. 尝试为之前的表中插入10万条随机数据

import random
import mysql.connector
from datetime import datetime, timedelta

# 生成随机姓名
def random_name():
    first_names = ['张', '李', '王', '刘', '陈', '杨', '赵', '黄', '周', '吴']
    last_names = ['伟', '芳', '娜', '敏', '强', '磊', '军', '洋', '勇', '娟']
    return random.choice(first_names) + random.choice(last_names)

# 生成指定范围内的随机日期
def random_date(start, end):
    delta = end - start
    return start + timedelta(days=random.randint(0, delta.days))

# 连接数据库
conn = mysql.connector.connect(
    host='localhost',
    user='root',
    password='your_password',
    database='your_database'
)
cursor = conn.cursor()

# 准备插入语句
insert_sql = "INSERT INTO users (name, birthday, gender) VALUES (%s, %s, %s)"

batch_size = 1000
total_records = 100000
start_date = datetime.strptime('1980-01-01', '%Y-%m-%d')
end_date = datetime.strptime('2005-12-31', '%Y-%m-%d')

try:
    for i in range(0, total_records, batch_size):
        batch_data = []
        for _ in range(batch_size):
            name = random_name()
            birthday = random_date(start_date, end_date).date()
            gender = random.choice(['男', '女'])
            batch_data.append((name, birthday, gender))

        cursor.executemany(insert_sql, batch_data)
        conn.commit()  # 每批提交一次事务
        print(f"Inserted {i + batch_size} records...")

    print("Data insertion completed.")
except Exception as e:
    print(f"Error occurred: {e}")
finally:
    cursor.close()
    conn.close()


5. 查询年龄最大的10个人,记录查询时间,之后为生日字段添加索引,再次查询,对比有索引和无索引,快了多长时间

import time
import mysql.connector

# 数据库配置信息,请根据实际情况修改
config = {
    'user': 'root',
    'password': '911209787',
    'host': '192.168.75.130',
    'database': 'test_db',
    'raise_on_warnings': True
}

def execute_query(query):
    # 连接数据库
    cnx = mysql.connector.connect(**config)
    cursor = cnx.cursor()

    start_time = time.time()  # 记录开始时间
    cursor.execute(query)     # 执行SQL查询
    result = cursor.fetchall()# 获取所有结果
    end_time = time.time()    # 记录结束时间

    elapsed_time = end_time - start_time  # 计算耗时

    cursor.close()
    cnx.close()

    return result, elapsed_time

def main():
    # 查询年龄最大的10个人(即出生日期最早的10个人)
    query = "SELECT * FROM users ORDER BY birthday ASC LIMIT 10;"

    result, elapsed_time = execute_query(query)

    print(f"查询结果: {result}")
    print(f"无索引时查询耗时: {elapsed_time:.6f} 秒")

if __name__ == "__main__":
    main()

添加索引

ALTER TABLE users ADD INDEX idx_birthday (birthday);


6. 什么是事务,事务有哪些特性

什么是事务?

在数据库管理系统中,事务(Transaction) 是一个逻辑操作单元,它包含一组数据库操作语句。这些操作要么全部成功执行,要么全部失败回滚,形成一个不可分割的工作单位。事务确保数据从一种一致状态转换到另一种一致状态。

例如,在银行转账场景中:

  • A 账户减少 100 元;

  • B 账户增加 100 元。

这两个操作必须作为一个事务来处理,以防止其中一条操作失败导致数据不一致。


事务的四大特性(ACID)

事务具有四个核心特性,通常称为 ACID 特性

特性

中文名称

描述

A

原子性(Atomicity)

事务是一个不可分割的工作单位,事务中的操作要么全部完成,要么全部不执行。如果事务中任何一个操作失败,则整个事务回滚。

C

一致性(Consistency)

事务执行前后,数据库的完整性约束(如主键、外键、唯一性约束等)保持不变。数据必须始终处于合法状态。

I

隔离性(Isolation)

多个事务并发执行时,一个事务的执行不应影响其他事务。每个事务都感觉不到其他事务在“同时”执行。

D

持久性(Durability)

一旦事务提交,对数据库的修改就是永久性的,即使系统发生故障也不会丢失。

事务控制命令(SQL)

命令

作用

START TRANSACTION;

开始一个新的事务

COMMIT;

提交事务,使所有更改生效

ROLLBACK;

回滚事务,撤销所有未提交的更改

SET AUTOCOMMIT=0;

关闭自动提交模式,手动控制事务


7. 事务如何标记开始,执行和回滚

数据库操作中,事务的生命周期通常包括以下几个阶段:开始、执行、提交或回滚。以下是详细的说明和示例:


1. 事务的开始

事务的开始可以通过显式声明来启动,也可以由数据库自动隐式开始。

显式开始事务

使用 START TRANSACTIONBEGIN 命令来手动开启事务。

START TRANSACTION;
-- 或者
BEGIN;

隐式开始事务

当你执行第一个数据修改语句(如 INSERT, UPDATE, DELETE)时,数据库会自动开启一个事务(取决于数据库配置和是否启用自动提交模式)。


2. 事务的执行

在事务开始后,你可以执行多个 SQL 操作,这些操作属于同一个事务,直到你明确提交 (COMMIT) 或回滚 (ROLLBACK)。

示例:银行转账场景

START TRANSACTION;

-- A 账户减少 100 元
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;

-- B 账户增加 100 元
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;

在这个例子中,两个 UPDATE 操作都在同一个事务中。


3. 事务的提交

如果所有操作都成功完成,并且你确认希望将更改永久保存到数据库中,则可以使用 COMMIT 提交事务。

COMMIT;

一旦提交,所有的更改都会被写入数据库,并对其他事务可见。

4. 事务的回滚

如果在事务执行过程中发生错误,或者你决定放弃当前的更改,可以使用 ROLLBACK 回滚事务。

ROLLBACK;

这将撤销事务中的所有更改,恢复到事务开始前的状态。

完整示例:

-- 开始事务
START TRANSACTION;

-- 执行操作
UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;

-- 检查是否有错误(可选)
-- 如果一切正常,提交事务
COMMIT;

-- 如果出错,回滚事务
-- ROLLBACK;


8. 什么是数据一致性,在关系型数据库中,数据一致性是否是最重要的

什么是数据一致性?

数据一致性(Data Consistency) 是指在数据库系统中,数据在整个生命周期内始终保持合法、有效和可预测的状态。这意味着:

  • 数据库中的所有数据都符合预定义的业务规则、约束和逻辑;

  • 数据不会因为并发操作、系统故障或错误操作而处于不一致状态;

  • 所有事务执行前后,数据库从一个一致状态转换到另一个一致状态。


在关系型数据库中,数据一致性是构建可靠系统的基础,因此通常是最重要的目标之一。不过,在特定场景(如高并发、大数据量分析)中,可以根据需求在一致性与其他特性之间进行权衡。


9. 什么是锁,是为了解决什么问题,达到什么效果

锁(Lock) 是一种 并发控制机制,用于在多个用户或进程同时访问共享资源时,防止数据不一致、冲突或破坏。
在数据库和操作系统中,锁可以确保:

  • 同一时间只有一个线程/事务能修改某个资源;

  • 避免脏读、不可重复读、幻读等并发问题;

  • 维护数据的完整性和一致性。

锁是为了解决什么问题?

1. 并发访问导致的数据不一致

当多个事务同时操作同一数据时,可能出现以下问题:

现象

描述

脏读(Dirty Read)

一个事务读取了另一个未提交事务的中间状态数据

不可重复读(Non-repeatable Read)

同一事务多次读取某行数据,结果不同(因为其他事务更新了该行)

幻读(Phantom Read)

同一事务多次执行相同查询,返回的结果集数量变化(因为其他事务插入或删除了记录)

更新丢失(Lost Update)

多个事务同时更新同一数据,后者的更新覆盖前者

2. 资源竞争(Race Condition)

多个线程/进程同时尝试修改同一个资源(如计数器、库存数量),可能导致最终值错误。

3. 死锁(Deadlock)

两个或多个事务相互等待对方释放资源,导致系统停滞。


锁能达到什么效果?

效果

描述

互斥访问

保证同一时间只有一个事务能访问特定资源

数据一致性

防止因并发写入导致的数据混乱

事务隔离性

实现事务之间的隔离级别(如 READ COMMITTED, REPEATABLE READ

避免脏数据

防止事务读取到未提交的中间状态数据

有序执行

控制并发事务的执行顺序,确保逻辑正确

锁是数据库和操作系统中实现并发安全和数据一致性的核心机制。通过合理使用锁,可以有效防止并发问题、维护系统稳定,并保障业务逻辑的正确执行。


10. 什么是表锁,行锁。什么是共享锁,排它锁。

锁按锁定对象划分可以划分为以下三种:

类型

描述

示例

行级锁(Row-level Lock)

只锁定一行记录,适用于高并发场景

InnoDB 表中对某条记录加锁

表级锁(Table-level Lock)

锁定整张表,适用于低并发、大数据量操作

MyISAM 引擎使用的锁机制

页级锁(Page-level Lock)

锁定一页(通常为 16KB 左右),介于行锁和表锁之间

BDB 存储引擎使用

锁按访问权限划分可以分为以下三种:

类型

描述

使用场景

共享锁(Shared Lock, S-Lock)

允许事务读取数据,但禁止修改;其他事务也可以加共享锁

读操作时使用

排他锁(Exclusive Lock, X-Lock)

禁止其他事务读取和修改;只有当前事务可以访问

写操作时使用

意向锁(Intention Lock)

表示事务想要在某些行上加锁,用于协调表级锁与行级锁

自动由数据库管理系统维护

锁类型

使用命令

是否阻塞其他事务

是否需要显式提交/回滚

是否支持并发

表锁(共享)

LOCK TABLE users READ;

多个事务可同时读

表锁(排他)

LOCK TABLE users WRITE;

不允许并发访问

行锁(共享)

SELECT ... LOCK IN SHARE MODE;

是(需事务)

支持并发读

行锁(排他)

SELECT ... FOR UPDATE;

是(需事务)

不允许并发读写

自动行锁

UPDATE, DELETE

是(隐式事务)

InnoDB 自动处理


11. 什么是悲观锁,什么是乐观锁,什么是意向锁

一、悲观锁(Pessimistic Lock)

定义:

悲观锁 假设并发冲突 经常发生,因此在整个数据操作过程中都会加锁,防止其他事务访问或修改。

加锁方式:

  • 显式使用 SELECT ... FOR UPDATESELECT ... LOCK IN SHARE MODE

  • 在更新前锁定资源,确保整个事务期间只有当前事务可以操作

适用场景:

  • 写操作频繁的业务

  • 高并发环境下对数据一致性要求高

  • 数据竞争激烈(如库存扣减、订单处理)

二、乐观锁(Optimistic Lock)

定义:

乐观锁 假设并发冲突 不常发生,只在提交更新时检查版本号或时间戳,如果发现冲突则拒绝执行更新并提示用户重试。

实现方式:

  • 使用版本号字段(version

  • 使用时间戳字段(timestamp

  • 检查字段值是否变化,再决定是否允许更新

适用场景:

  • 读多写少的系统(如论坛、文档协作编辑)

  • 网络环境复杂、长事务操作

  • 不希望长时间持有数据库锁的情况

三、意向锁(Intention Lock)

定义:

意向锁 是一种表级锁,用于表示事务想要在某些行上加锁。它本身并不直接限制其他事务的操作,而是告诉数据库“我准备在某一行上加锁”。

类型:

类型

中文名

描述

意向共享锁(IS)

Intent Shared Lock

表示事务打算给某些行加共享锁

意向排他锁(IX)

Intent Exclusive Lock

表示事务打算给某些行加排他锁

工作机制:

  • 当事务对某行加锁时,InnoDB 自动为对应的表加上意向锁;

  • 其他事务看到意向锁后,就知道后续可能有行锁操作,从而避免冲突。


12. 什么是死锁,死锁的出现需要满足哪些条件,出现死锁后如何处理,如何预防

一、什么是死锁?

死锁(Deadlock) 是指两个或多个事务在执行过程中,因争夺资源而造成的一种 互相等待的僵局。每个事务都持有部分资源,并等待其他事务释放它所需的资源,导致所有事务都无法继续执行。


二、死锁出现需要满足哪些条件?(四个必要条件)

死锁的发生必须同时满足以下 四个条件

条件

描述

1. 互斥(Mutual Exclusion)

资源不能共享,只能被一个事务独占使用

2. 持有并等待(Hold and Wait)

事务在等待其他资源时,不释放自己已持有的资源

3. 不可抢占(No Preemption)

资源只能由持有它的事务主动释放,不能被强制剥夺

4. 循环等待(Circular Wait)

存在一个事务链 A→B→C→A,彼此都在等待对方释放资源

三、出现死锁后如何处理?

1. 数据库自动检测与回滚

  • 大多数数据库系统(如 MySQL InnoDB、Oracle、PostgreSQL)会定期运行死锁检测机制

  • 发现死锁后,会选择一个代价最小的事务进行 回滚(Rollback)

  • 回滚事务后,其他事务可以继续执行。

2. 应用层重试机制

  • 在代码中捕获死锁异常(如 MySQL 返回 Deadlock found when trying to get lock);

  • 自动重试事务(建议设置最大重试次数和退避时间);

四、如何预防死锁?

1. 统一访问顺序

  • 所有事务按相同的顺序访问表和字段;

  • 避免不同事务以不同顺序加锁,减少循环依赖。

2. 缩短事务生命周期

  • 尽量减少事务执行时间和锁持有时间;

  • 提交或回滚越快,锁释放越快,降低冲突概率。

3. 合理设置索引

  • 索引缺失可能导致锁升级为表锁;

  • 合理使用索引,避免全表扫描带来的锁竞争。

4. 批量操作优先

  • 将多个 SQL 操作合并为一个事务,减少多次交互带来的锁竞争;

  • 减少网络延迟对事务的影响。

5. 设置合理的超时时间

  • 设置事务等待锁的最大时间(InnoDB 默认 50 秒):

SET innodb_lock_wait_timeout = 30; -- 设置等待锁最多 30 秒

6. 使用乐观锁替代悲观锁

  • 对于写冲突较少的场景,使用乐观锁(版本号控制)替代行锁;

  • 避免长时间持有锁资源。

总结

死锁相关问题

回答

什么是死锁?

多个事务相互等待对方释放资源,形成循环依赖

死锁发生的四个条件?

互斥、持有并等待、不可抢占、循环等待

如何发现死锁?

使用 SHOW ENGINE INNODB STATUS\G 查看

数据库如何处理死锁?

自动选择一个事务回滚,打破循环

如何预防死锁?

统一访问顺序、缩短事务、使用乐观锁、合理设置索引

如何在代码中处理死锁?

捕获异常、自动重试、确保事务回滚


13. 什么是隐式加锁,什么是显式加锁,显式加锁有什么注意事项

一、什么是隐式加锁?

隐式加锁(Implicit Locking) 是指数据库在执行某些操作时 自动为资源加上锁,开发者无需手动干预。

常见隐式加锁场景(MySQL InnoDB):

操作

自动加的锁类型

SELECT

不加锁(默认)

SELECT ... LOCK IN SHARE MODE

共享锁(Shared Lock)

SELECT ... FOR UPDATE

排他锁(Exclusive Lock)

UPDATE, DELETE

排他锁(行级锁)

插入/更新主键或唯一索引

隐式加锁防止冲突

二、什么是显式加锁?

显式加锁(Explicit Locking) 是指开发者通过 SQL 显式地为某个表或记录加锁,控制并发访问。

显式加锁命令示例(MySQL):

表锁:

LOCK TABLE users READ;   -- 加共享表锁
LOCK TABLE users WRITE;  -- 加排他表锁
UNLOCK TABLES;           -- 解锁

行锁:

START TRANSACTION;
SELECT * FROM inventory WHERE product_id = 1001 FOR UPDATE; -- 排他锁
COMMIT;

三、显式加锁有什么注意事项?

✅ 使用建议

项目

建议

事务包裹

显式加锁必须在事务中使用(如 START TRANSACTION; ... COMMIT;

尽早加锁

在事务开始后尽快加锁,避免其他事务干扰

及时提交或回滚

锁在事务提交或回滚后释放,避免长事务导致死锁

按统一顺序加锁

所有事务应按相同顺序访问资源,减少死锁概率

合理使用索引

若查询无索引,可能升级为表锁,影响性能和并发

避免嵌套事务

MySQL 不支持真正的嵌套事务,容易造成锁混乱

配合异常处理

出现异常时优先回滚事务,释放锁资源


四、显式加锁的常见问题与规避策略

问题

描述

规避方法

死锁

多个事务相互等待对方持有的锁

统一访问顺序,设置超时机制

锁等待超时

事务等待锁时间超过设定值(默认 50 秒)

设置 innodb_lock_wait_timeout

锁粒度不当

使用表锁而非行锁,影响并发

根据业务需求选择合适锁粒度

未释放锁

忘记提交或回滚事务,锁未释放

使用 try-finally 确保事务结束

SQL 语法错误

显式加锁语句拼写错误导致锁未生效

使用 ORM 或封装 SQL 工具类

锁升级

查询无索引,导致行锁升级为表锁

合理建立索引,避免全表扫描


14. 如果没有锁,会出现哪些问题?什么是脏读、幻读、不可重复读、丢失更新

在并发数据库操作中,如果没有锁机制,多个事务同时访问和修改数据时会出现一系列一致性问题,最常见的包括:

问题

描述

脏读(Dirty Read)

一个事务读取到另一个未提交事务的中间状态数据

不可重复读(Non-repeatable Read)

同一事务多次读取某行记录,结果不一致(因其他事务更新了该行)

幻读(Phantom Read)

同一事务多次执行相同查询,返回的结果集数量变化(因其他事务插入或删除了记录)

丢失更新(Lost Update)

多个事务同时更新同一数据,后者的更新覆盖前者,造成数据丢失

写偏移(Write Skew)

两个事务基于不同的前提条件进行更新,导致最终状态不符合业务规则


15. 事务的4个隔离级别分别是什么,每个隔离级别能防止哪些并发问题

事务的隔离级别用于控制事务之间的可见性和并发行为,确保在多事务同时执行时数据的一致性。SQL 标准定义了四个事务隔离级别,每个级别能防止不同的并发问题。

事务的 4 个隔离级别

隔离级别

SQL 标准名称

是否允许脏读

是否允许不可重复读

是否允许幻读

是否允许写偏移

1

READ UNCOMMITTED

✅ 允许

✅ 允许

✅ 允许

✅ 允许

2

READ COMMITTED

❌ 不允许

✅ 允许

✅ 允许

✅ 允许

3

REPEATABLE READ

❌ 不允许

❌ 不允许

❌ 不允许

❌ 取决于实现

4

SERIALIZABLE

❌ 不允许

❌ 不允许

❌ 不允许


每个隔离级别能防止哪些并发问题?

1. READ UNCOMMITTED(读未提交)

  • 特点:最低的隔离级别,事务可以读取其他事务尚未提交的数据。

  • 适用场景:几乎不用于生产环境。

  • 可出现的问题

    • 脏读

    • 不可重复读

    • 幻读

    • 写偏移

2. READ COMMITTED(读已提交)

  • 特点:事务只能看到已经提交的数据变更。

  • 适用场景:适用于对一致性要求不高、但希望提高并发性能的系统。

  • 可出现的问题

    • 脏读

    • 不可重复读

    • 幻读

    • 写偏移

3. REPEATABLE READ(可重复读)

  • 特点:事务在整个执行期间多次读取同一行的结果保持一致。

  • 适用场景:MySQL 默认使用的隔离级别。

  • 可出现的问题

    • 脏读

    • 不可重复读

    • 幻读 (InnoDB 使用间隙锁解决此问题)

    • 写偏移 (取决于数据库实现)

4. SERIALIZABLE(串行化)

  • 特点:所有事务串行执行,避免一切并发问题。

  • 适用场景:对一致性要求极高,且并发性能不是主要考虑因素的金融系统或审计系统。

  • 可出现的问题

    • 脏读

    • 不可重复读

    • 幻读

    • 写偏移

隔离级别与锁机制的关系

隔离级别

使用的锁机制

锁粒度

READ UNCOMMITTED

不加锁

无锁

READ COMMITTED

行级锁(共享/排他)

行级锁

REPEATABLE READ

行级锁 + Gap Lock

行级锁 + 间隙锁

SERIALIZABLE

表级锁

表级锁


16. 如何查看当前数据库的锁等待和死锁信息

一、查看当前锁等待信息

方法:查询 information_schema 中的 INNODB_LOCKSINNODB_LOCK_WAITS

SELECT 
    r.trx_id AS waiting_trx_id,
    r.trx_mysql_thread_id AS waiting_thread,
    r.trx_query AS waiting_query,
    b.trx_id AS blocking_trx_id,
    b.trx_mysql_thread_id AS blocking_thread,
    b.trx_query AS blocking_query
FROM 
    information_schema.INNODB_LOCK_WAITS w
JOIN 
    information_schema.INNODB_TRX b ON b.trx_id = w.blocking_trx_id
JOIN 
    information_schema.INNODB_TRX r ON r.trx_id = w.requesting_trx_id;

输出字段说明:

字段

描述

waiting_trx_id

正在等待锁的事务 ID

waiting_thread

正在等待锁的线程 ID

waiting_query

正在等待锁的 SQL 语句

blocking_trx_id

阻塞事务的事务 ID

blocking_thread

阻塞事务的线程 ID

blocking_query

阻塞事务正在执行的 SQL

二、查看最近一次死锁信息

方法:使用 SHOW ENGINE INNODB STATUS\G

SHOW ENGINE INNODB STATUS\G

功能

SQL 命令

用途

查看锁等待

查询 INNODB_LOCK_WAITS

找出哪些事务在等待锁

查看死锁信息

SHOW ENGINE INNODB STATUS\G

分析最近一次死锁发生的原因

查看当前事务

查询 INNODB_TRX

查看活跃事务及其状态

查看锁信息

查询 INNODB_LOCKS

查看当前数据库中的锁信息

设置锁等待超时

SET innodb_lock_wait_timeout = 30;

控制事务等待锁的最大时间

以他人的幸福为幸福,以他人的享乐为享乐。