mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 05:22:25 +01:00
8392a814af
cursors (+ commit)" and Bug#11832 "Server crash with InnoDB + Cursors" See comments to the changed files.
148 lines
5.1 KiB
C
148 lines
5.1 KiB
C
/******************************************************
|
|
Cursor read
|
|
|
|
(c) 1997 Innobase Oy
|
|
|
|
Created 2/16/1997 Heikki Tuuri
|
|
*******************************************************/
|
|
|
|
#ifndef read0read_h
|
|
#define read0read_h
|
|
|
|
#include "univ.i"
|
|
|
|
|
|
#include "ut0byte.h"
|
|
#include "ut0lst.h"
|
|
#include "trx0trx.h"
|
|
#include "read0types.h"
|
|
|
|
/*************************************************************************
|
|
Opens a read view where exactly the transactions serialized before this
|
|
point in time are seen in the view. */
|
|
|
|
read_view_t*
|
|
read_view_open_now(
|
|
/*===============*/
|
|
/* out, own: read view struct */
|
|
trx_t* cr_trx, /* in: creating transaction, or NULL */
|
|
mem_heap_t* heap); /* in: memory heap from which allocated */
|
|
/*************************************************************************
|
|
Makes a copy of the oldest existing read view, or opens a new. The view
|
|
must be closed with ..._close. */
|
|
|
|
read_view_t*
|
|
read_view_oldest_copy_or_open_new(
|
|
/*==============================*/
|
|
/* out, own: read view struct */
|
|
trx_t* cr_trx, /* in: creating transaction, or NULL */
|
|
mem_heap_t* heap); /* in: memory heap from which allocated */
|
|
/*************************************************************************
|
|
Closes a read view. */
|
|
|
|
void
|
|
read_view_close(
|
|
/*============*/
|
|
read_view_t* view); /* in: read view */
|
|
/*************************************************************************
|
|
Closes a consistent read view for MySQL. This function is called at an SQL
|
|
statement end if the trx isolation level is <= TRX_ISO_READ_COMMITTED. */
|
|
|
|
void
|
|
read_view_close_for_mysql(
|
|
/*======================*/
|
|
trx_t* trx); /* in: trx which has a read view */
|
|
/*************************************************************************
|
|
Checks if a read view sees the specified transaction. */
|
|
UNIV_INLINE
|
|
ibool
|
|
read_view_sees_trx_id(
|
|
/*==================*/
|
|
/* out: TRUE if sees */
|
|
read_view_t* view, /* in: read view */
|
|
dulint trx_id); /* in: trx id */
|
|
/*************************************************************************
|
|
Prints a read view to stderr. */
|
|
|
|
void
|
|
read_view_print(
|
|
/*============*/
|
|
read_view_t* view); /* in: read view */
|
|
/*************************************************************************
|
|
Create a consistent cursor view for mysql to be used in cursors. In this
|
|
consistent read view modifications done by the creating transaction or future
|
|
transactions are not visible. */
|
|
|
|
cursor_view_t*
|
|
read_cursor_view_create_for_mysql(
|
|
/*==============================*/
|
|
trx_t* cr_trx);/* in: trx where cursor view is created */
|
|
/*************************************************************************
|
|
Close a given consistent cursor view for mysql and restore global read view
|
|
back to a transaction read view. */
|
|
|
|
void
|
|
read_cursor_view_close_for_mysql(
|
|
/*=============================*/
|
|
trx_t* trx, /* in: trx */
|
|
cursor_view_t* curview); /* in: cursor view to be closed */
|
|
/*************************************************************************
|
|
This function sets a given consistent cursor view to a transaction
|
|
read view if given consistent cursor view is not NULL. Otherwise, function
|
|
restores a global read view to a transaction read view. */
|
|
|
|
void
|
|
read_cursor_set_for_mysql(
|
|
/*======================*/
|
|
trx_t* trx, /* in: transaction where cursor is set */
|
|
cursor_view_t* curview);/* in: consistent cursor view to be set */
|
|
|
|
/* Read view lists the trx ids of those transactions for which a consistent
|
|
read should not see the modifications to the database. */
|
|
|
|
struct read_view_struct{
|
|
ibool can_be_too_old; /* TRUE if the system has had to purge old
|
|
versions which this read view should be able
|
|
to access: the read view can bump into the
|
|
DB_MISSING_HISTORY error */
|
|
dulint low_limit_no; /* The view does not need to see the undo
|
|
logs for transactions whose transaction number
|
|
is strictly smaller (<) than this value: they
|
|
can be removed in purge if not needed by other
|
|
views */
|
|
dulint low_limit_id; /* The read should not see any transaction
|
|
with trx id >= this value */
|
|
dulint up_limit_id; /* The read should see all trx ids which
|
|
are strictly smaller (<) than this value */
|
|
ulint n_trx_ids; /* Number of cells in the trx_ids array */
|
|
dulint* trx_ids; /* Additional trx ids which the read should
|
|
not see: typically, these are the active
|
|
transactions at the time when the read is
|
|
serialized, except the reading transaction
|
|
itself; the trx ids in this array are in a
|
|
descending order */
|
|
trx_t* creator; /* Pointer to the creating transaction, or
|
|
NULL if used in purge */
|
|
UT_LIST_NODE_T(read_view_t) view_list;
|
|
/* List of read views in trx_sys */
|
|
};
|
|
|
|
/* Implement InnoDB framework to support consistent read views in
|
|
cursors. This struct holds both heap where consistent read view
|
|
is allocated and pointer to a read view. */
|
|
|
|
struct cursor_view_struct{
|
|
mem_heap_t* heap;
|
|
/* Memory heap for the cursor view */
|
|
read_view_t* read_view;
|
|
/* Consistent read view of the cursor*/
|
|
ulint n_mysql_tables_in_use;
|
|
/* number of Innobase tables used in the
|
|
processing of this cursor */
|
|
};
|
|
|
|
#ifndef UNIV_NONINL
|
|
#include "read0read.ic"
|
|
#endif
|
|
|
|
#endif
|