MySQL中仅执行BEGIN/START TRANSACTION是否真的启动事务?
问题解答:MySQL中
BEGIN/START TRANSACTION是否真的启动事务? 仅执行BEGIN;或START TRANSACTION;确实会启动事务,但InnoDB采用「事务懒初始化」机制,导致你一开始在information_schema.innodb_trx中查不到记录,直到执行实际数据库操作后才会显示。
具体原因分析:
BEGIN/START TRANSACTION的作用是将当前会话标记为「事务模式」,但此时InnoDB不会立即为事务分配trx_id,也不会写入事务日志——因为还没有任何需要事务跟踪的实际操作(比如数据读写、快照生成)。- 当你执行
SELECT * FROM person这类查询时,InnoDB需要为事务生成MVCC快照(保证事务隔离性),此时才会正式初始化事务资源,分配trx_id,并将事务信息写入innodb_trx表,所以后续查询就能看到记录。
验证小技巧:
即使执行一个无意义的只读查询,比如SELECT 1;,之后再查询innodb_trx,也会看到对应的事务记录——因为MVCC快照的生成触发了事务资源的初始化。
额外说明:
不要误以为innodb_trx中没有记录就代表事务没启动。比如在BEGIN后直接执行ROLLBACK;,操作会生效,说明会话确实处于事务上下文当中,只是InnoDB还没为其分配可见的事务ID而已。
内容的提问来源于stack exchange,提问作者Super Kai - Kazuya Ito
相关产品推荐
相关产品推荐

