作者回复: 对的,没有提交的事务会在InnoDB启动时回滚。 考虑到事务中修改的数据比较多,回滚可能会需要很长一段时间。回滚的过程中,还是会锁住这个表的记录。其他会话如果要修改这个表的记录,要等待锁。 在这个场景下,可能要将业务切换到备库,才能更快地恢复业务。
作者回复: 数据库启动时,会使用一个后台线程回滚没有提交的事务。回滚的过程中,其他会话可以正常访问数据库,如果要访问正在回滚的这个表,可以使用MVCC或者要等待锁。 处理事务回滚的后台线程,在Processlist里看不到,不过可以在performance_schema.threads表里查到(name = 'thread/innodb/trx_recovery_rollback_thread'),或者用pstack查看。 参数innodb_force_recovery设置为3 (SRV_FORCE_NO_TRX_UNDO)或更大的值后,启动时不回滚事务。不过我没有测试过这种情况。