{\rtf1\ansi\ansicpg1252\deff0\nouicompat\deflang1033{\fonttbl{\f0\fnil\fcharset0 Calibri;}} {\*\generator Riched20 10.0.15063}\viewkind4\uc1 \pard\sa200\sl276\slmult1\f0\fs22\lang9 index 1055b56..e92feb5 100644\par --- a/storage/innobase/trx/trx0trx.cc\par +++ b/storage/innobase/trx/trx0trx.cc\par @@ -1244,10 +1244,14 @@ static void trx_start_low(\par \par if (!trx->read_only &&\par (trx->mysql_thd == 0 || read_write || trx->ddl_operation)) \{\par +\par trx_assign_rseg_durable(trx);\par + ut_ad(trx->rsegs.m_redo.rseg != 0 || srv_read_only_mode ||\par + srv_force_recovery >= SRV_FORCE_NO_TRX_UNDO);\par \par - /* Temporary rseg is assigned only if the transaction\par - updates a temporary table */\par + trx->state = TRX_STATE_ACTIVE;\par +\par + ut_ad(trx_sys_validate_trx_list());\par \par trx_sys_mutex_enter();\par \par @@ -1255,11 +1259,9 @@ static void trx_start_low(\par \par trx_sys->rw_trx_ids.push_back(trx->id);\par \par + trx_sys_mutex_exit();\par trx_sys_rw_trx_add(trx);\par \par - ut_ad(trx->rsegs.m_redo.rseg != 0 || srv_read_only_mode ||\par - srv_force_recovery >= SRV_FORCE_NO_TRX_UNDO);\par -\par UT_LIST_ADD_FIRST(trx_sys->rw_trx_list, trx);\par \par ut_d(trx->in_rw_trx_list = true);\par @@ -1269,11 +1271,6 @@ static void trx_start_low(\par \}\par #endif /* UNIV_DEBUG */\par \par - trx->state = TRX_STATE_ACTIVE;\par -\par - ut_ad(trx_sys_validate_trx_list());\par -\par - trx_sys_mutex_exit();\par \} else \{\par trx->id = 0;\par @@ -1666,10 +1663,22 @@ also released by this call as trx is removed from rw_trx_list.\par @param[in] trx Transaction to erase, must have an ID > 0\par @param[in] serialised true if serialisation log was written */\par static void trx_erase_lists(trx_t *trx, bool serialised) \{\par +\par ut_ad(trx->id > 0);\par - trx_sys_mutex_enter();\par +\par + if (trx->rsegs.m_redo.rseg && trx->read_view) \{\par + ut_ad(!trx->in_rw_trx_list);\par + trx_sys_mutex_enter();\par + trx_sys->mvcc->view_close(trx->read_view, true);\par + \} else \{\par + trx_sys_mutex_enter();\par + UT_LIST_REMOVE(trx_sys->rw_trx_list, trx);\par + ut_d(trx->in_rw_trx_list = false);\par + ut_ad(trx_sys_validate_trx_list());\par +\par + \}\par \par - if (serialised) \{\par + if (serialised) \{\par UT_LIST_REMOVE(trx_sys->serialisation_list, trx);\par \}\par \par @@ -1678,18 +1687,6 @@ static void trx_erase_lists(trx_t *trx, bool serialised) \{\par ut_ad(*it == trx->id);\par trx_sys->rw_trx_ids.erase(it);\par \par - if (trx->read_only || trx->rsegs.m_redo.rseg == NULL) \{\par - ut_ad(!trx->in_rw_trx_list);\par - \} else \{\par - UT_LIST_REMOVE(trx_sys->rw_trx_list, trx);\par - ut_d(trx->in_rw_trx_list = false);\par - ut_ad(trx_sys_validate_trx_list());\par -\par - if (trx->read_view != NULL) \{\par - trx_sys->mvcc->view_close(trx->read_view, true);\par - \}\par - \}\par -\par trx_sys->rw_trx_set.erase(TrxTrack(trx->id));\par \par /* Set minimal active trx id. */\par @@ -2870,7 +2867,7 @@ void trx_set_rw_mode(trx_t *trx) /*!< in/out: transaction that is RW */\par \par /* So that we can see our own changes. */\par if (MVCC::is_view_active(trx->read_view)) \{\par - MVCC::set_view_creator_trx_id(trx->read_view, trx->id);\par + trx->read_view->creator_trx_id(trx->id);\par \}\par \par #ifdef UNIV_DEBUG\par }