社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

大厂面试题:说一下mysql可能出现什么和并发相关问题?

鸭哥聊Java • 2 周前 • 53 次点击  

最近有朋友问我,MySQL 并发访问下会出现哪些常见问题。其实,这个话题非常重要,尤其是当你的系统并发量高时,如果不了解相关机制,可能随时踩坑。

说到 MySQL 的并发问题,主要集中在事务隔离级别上。MySQL 支持四种事务隔离级别:读未提交(Read Uncommitted)读已提交(Read Committed)可重复读(Repeatable Read)串行化(Serializable)。不同的隔离级别能有效避免一些常见的问题,比如脏读、不可重复读和幻读。

脏读(Dirty Read)

脏读是指一个事务读取了另一个事务中尚未提交的数据。这种数据是“脏”的,因为另一个事务可能会回滚,导致已读到的数据无效。

举个例子:

事务 A 和事务 B 同时操作数据库。

-- 事务 A
START TRANSACTION;
UPDATE accounts SET balance = 2000 WHERE id = 1;
-- 事务 A 还未提交
-- 事务 B(隔离级别为 Read Uncommitted)
SELECT balance FROM accounts WHERE id = 1;
-- 输出:2000 (未提交的数据)

如果事务 A 执行了回滚操作:




    
ROLLBACK

那么,事务 B 读取到的数据 2000 就是无效的,出现了“脏读”现象。为了解决这个问题,可以将隔离级别提高到 读已提交(Read Committed)

不可重复读(Non-Repeatable Read)

不可重复读指的是同一事务内多次读取同一条数据时,数据内容不一致。通常发生在隔离级别为 读已提交(Read Committed) 时。

假设事务 A 和事务 B 同时操作:

-- 事务 A
START TRANSACTION;
SELECT balance FROM accounts WHERE id = 1;
-- 输出:1000

此时,事务 B 更新了这条记录并提交:

-- 事务 B
START TRANSACTION;
UPDATE accounts SET balance = 3000 WHERE id = 1;
COMMIT;

然后事务 A 再次读取这条数据:

-- 事务 A
SELECT balance FROM accounts WHERE id = 1;
-- 输出:3000 (数据已被其他事务修改)

事务 A 在同一事务中读取到的数据不一致,出现了“不可重复读”的问题。解决方案是将隔离级别提升为 可重复读(Repeatable Read)

幻读(Phantom Read)

幻读指的是同一事务内多次查询数据时,符合条件的数据行数发生变化,仿佛产生了“幻觉”。

举个例子:

-- 事务 A
START TRANSACTION;
SELECT COUNT(*) FROM accounts WHERE balance > 1000000;
-- 输出:5

事务 B 插入了一条新记录并提交:

-- 事务 B
START TRANSACTION;
INSERT INTO accounts (id, balance) VALUES (62000000);
COMMIT;

事务 A 再次查询:

-- 事务 A
SELECT COUNT(*) FROM accounts WHERE balance > 1000000;
-- 输出:6(行数发生变化)

解决幻读问题的方法是将隔离级别设为 串行化(Serializable),但这会大大降低并发性能,因此不建议轻易使用。

最后,我们来看看面试中会遇到的面试题:

问题:MySQL 并发事务中会出现哪些常见问题?如何解决?

回答:

MySQL 并发事务中常见的问题包括:脏读、不可重复读和幻读。出现这些问题的根本原因在于多个事务同时操作数据,导致数据一致性受损。

  1. 脏读(Dirty Read): 读取了未提交的数据,可能导致数据不一致。解决方法是将事务隔离级别提升到 读已提交(Read Committed)

  2. 不可重复读(Non-Repeatable Read): 同一事务内多次读取数据,前后结果不一致。解决方法是将隔离级别设为 可重复读(Repeatable Read)

  3. 幻读(Phantom Read): 同一事务内多次查询,数据行数不一致。解决方法是使用 串行化(Serializable) 隔离级别,但这会降低性能。

面试时,回答时可以补充相关的 SQL 示例和事务隔离级别,展示对事务机制的深入理解。

对编程、职场感兴趣的同学,可以链接我,微信:yagebug  拉你进入“程序员交流群”。
🔥鸭哥私藏精品 热门推荐🔥

鸭哥作为一名老码农,整理了全网最全《Java高级架构师资料合集》
资料包含了 《IDEA视频教程》《最全Java面试题库》、最全项目实战源码及视频》及《毕业设计系统源码》总量高达 650GB 。全部免费领取!全面满足各个阶段程序员的学习需求。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/177246
 
53 次点击