0

0

mysql存储引擎与事务管理中的常见问题与解决

P粉602998670

P粉602998670

发布时间:2026-01-13 09:46:36

|

711人浏览过

|

来源于php中文网

原创

MyISAM不支持事务,START TRANSACTION和ROLLBACK无效;InnoDB需确保索引使用、避免长事务、理解幻读机制及锁行为。

mysql存储引擎与事务管理中的常见问题与解决

MyISAM 不支持事务,START TRANSACTION 无效

如果你在 MyISAM 表上执行 START TRANSACTIONROLLBACK,MySQL 不会报错,但也不会真正回滚——所有 DML 操作仍会立即生效。这是因为 MyISAM 根本没有事务日志和行级锁机制。

  • 检查当前表引擎:
    SHOW CREATE TABLE `your_table`;
    ENGINE=MyISAM 还是 ENGINE=InnoDB
  • 转换引擎(需确保无外键依赖):
    ALTER TABLE `your_table` ENGINE = InnoDB;
  • 注意:MyISAM 的 AUTO_INCREMENT 是表级锁,高并发插入时可能成为瓶颈;InnoDB 是行级锁 + MVCC,更适合事务场景

InnoDB 中 SELECT ... FOR UPDATE 锁行为不按预期生效

SELECT ... FOR UPDATE 只在事务内、且隔离级别不低于 REPEATABLE READ 时才起作用;如果查询条件未命中索引,InnoDB 会升级为表锁,导致严重阻塞。

  • 必须确认查询走了索引:用
    EXPLAIN SELECT ... FOR UPDATE;
    查看 key 字段是否非 NULL
  • 避免在 WHERE 中使用函数或隐式类型转换(如 WHERE id = '123'id 是整型),否则索引失效
  • 若只读不更新,优先用 SELECT ... LOCK IN SHARE MODE 降低锁粒度

事务长时间未提交导致 Undo Log 膨胀与 ibdata1 文件持续增长

InnoDB 的 Undo Log 在事务提交前不能清理,长事务会阻止 purge 线程回收旧版本数据,最终拖慢查询、撑爆磁盘。

AI Content Detector
AI Content Detector

Writer推出的AI内容检测工具

下载
  • 查活跃长事务:
    SELECT * FROM information_schema.INNODB_TRX WHERE TIME_TO_SEC(TIMEDIFF(NOW(), TRX_STARTED)) > 60;
  • 避免在应用层开启事务后「先查再等用户输入」这类交互式操作
  • 设置超时防护:innodb_lock_wait_timeout = 50(单位秒),配合应用层重试逻辑
  • 注意:MySQL 5.7+ 默认 innodb_undo_log_truncate = ON,但仅对超过 innodb_max_undo_log_size 的独立 undo 表空间有效;共享表空间 ibdata1 中的 undo 永远不会自动收缩

幻读在 REPEATABLE READ 隔离级别下仍可能发生

很多人误以为 REPEATABLE READ 能完全避免幻读,其实 MySQL 的实现是通过间隙锁(Gap Lock)+ Next-Key Lock 抑制大部分幻读,但仅限于「当前读」(如 SELECT ... FOR UPDATE)。快照读(普通 SELECT)仍基于 MVCC,不加锁,因此不会感知新插入的记录。

  • 验证幻读场景:事务 A 执行 SELECT * FROM t WHERE id > 100(快照读),事务 B 插入 id = 105 并提交,事务 A 再次执行相同 SELECT 仍看不到该行——这不是幻读;但如果 A 改用 SELECT ... FOR UPDATE,B 的插入会被阻塞或报死锁
  • 真正需要串行化语义时,不要依赖隔离级别,而应显式加锁或用应用层分布式锁
  • 注意:MySQL 8.0 开始,READ COMMITTED 下间隙锁默认被禁用(innodb_locks_unsafe_for_binlog = OFF),进一步削弱幻读控制能力

事务管理不是开关一开就万事大吉的事,InnoDB 的锁、日志、隔离级别之间耦合极深,一个参数调错或一条 SQL 写偏,就可能让并发表现和预期天差地别。尤其要注意那些“不报错但没效果”的情况,比如 MyISAM 上的 ROLLBACK,或者没走索引的 FOR UPDATE

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

676

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

320

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

346

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1095

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

357

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

675

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

571

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

414

2024.04.29

php与html混编教程大全
php与html混编教程大全

本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

3

2026.01.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.7万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 787人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号