diff --git a/storage/innobase/handler/ha_innodb.cc b/storage/innobase/handler/ha_innodb.cc index 8a8fbed02df..fb9cb9a07a8 100644 --- a/storage/innobase/handler/ha_innodb.cc +++ b/storage/innobase/handler/ha_innodb.cc @@ -18896,11 +18896,16 @@ int ha_innobase::external_lock(THD *thd, /*!< in: handle to the user thread */ } else if (trx->isolation_level <= TRX_ISO_READ_COMMITTED && MVCC::is_view_active(trx->read_view)) { - mutex_enter(&trx_sys->mutex); + if ((trx->read_only || trx->rsegs.m_redo.rseg == nullptr) && + trx->read_view->empty()) { + trx_sys->mvcc->view_close(trx->read_view, false); + } else { + mutex_enter(&trx_sys->mutex); - trx_sys->mvcc->view_close(trx->read_view, true); + trx_sys->mvcc->view_close(trx->read_view, true); - mutex_exit(&trx_sys->mutex); + mutex_exit(&trx_sys->mutex); + } } } diff --git a/storage/innobase/read/read0read.cc b/storage/innobase/read/read0read.cc index 3cbac53668b..01c22f0b5ff 100644 --- a/storage/innobase/read/read0read.cc +++ b/storage/innobase/read/read0read.cc @@ -546,7 +546,9 @@ void MVCC::view_open(ReadView *&view, trx_t *trx) { Therefore we must set the low limit id after we reset the closed status after the check. */ - if (trx_is_autocommit_non_locking(trx) && view->empty()) { + if ((trx->isolation_level == TRX_ISO_READ_COMMITTED || + trx_is_autocommit_non_locking(trx)) && + view->empty()) { view->m_closed = false; if (view->m_low_limit_id == trx_sys_get_next_trx_id_or_no()) {