MySQL 8.0.40
Source Code Documentation
trx0i_s.h
Go to the documentation of this file.
1/*****************************************************************************
2
3Copyright (c) 2007, 2024, Oracle and/or its affiliates.
4
5This program is free software; you can redistribute it and/or modify it under
6the terms of the GNU General Public License, version 2.0, as published by the
7Free Software Foundation.
8
9This program is designed to work with certain software (including
10but not limited to OpenSSL) that is licensed under separate terms,
11as designated in a particular file or component or in included license
12documentation. The authors of MySQL hereby grant you an additional
13permission to link the program and your derivative works with the
14separately licensed software that they have either included with
15the program or referenced in the documentation.
16
17This program is distributed in the hope that it will be useful, but WITHOUT
18ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
19FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0,
20for more details.
21
22You should have received a copy of the GNU General Public License along with
23this program; if not, write to the Free Software Foundation, Inc.,
2451 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25
26*****************************************************************************/
27
28/** @file include/trx0i_s.h
29 INFORMATION SCHEMA innodb_trx, innodb_locks and
30 innodb_lock_waits tables cache structures and public
31 functions.
32
33 Created July 17, 2007 Vasil Dimov
34 *******************************************************/
35
36#ifndef trx0i_s_h
37#define trx0i_s_h
38
39#include <optional>
40
41#include "dict0types.h"
42#include "trx0types.h"
43#include "univ.i"
44
46
47/** The maximum amount of memory that can be consumed by innodb_trx,
48innodb_locks and innodb_lock_waits information schema tables. */
49constexpr uint32_t TRX_I_S_MEM_LIMIT = 16777216; /* 16 MiB */
50
51/** The maximum length of a string that can be stored in
52i_s_locks_row_t::lock_data */
53constexpr uint32_t TRX_I_S_LOCK_DATA_MAX_LEN = 8192;
54
55/** The maximum length of a string that can be stored in
56i_s_trx_row_t::trx_query */
57constexpr uint32_t TRX_I_S_TRX_QUERY_MAX_LEN = 1024;
58
59/** The maximum length of a string that can be stored in
60i_s_trx_row_t::trx_operation_state */
61constexpr uint32_t TRX_I_S_TRX_OP_STATE_MAX_LEN = 64;
62
63/** The maximum length of a string that can be stored in
64i_s_trx_row_t::trx_foreign_key_error */
65constexpr uint32_t TRX_I_S_TRX_FK_ERROR_MAX_LEN = 256;
66
67/** The maximum length of a string that can be stored in
68i_s_trx_row_t::trx_isolation_level */
70
71/** Safely copy strings in to the INNODB_TRX table's
72string based columns */
73#define TRX_I_S_STRING_COPY(data, field, constraint, tcache) \
74 do { \
75 if (strlen(data) > constraint) { \
76 char buff[constraint + 1]; \
77 strncpy(buff, data, constraint); \
78 buff[constraint] = '\0'; \
79 \
80 field = static_cast<const char *>( \
81 ha_storage_put_memlim((tcache)->storage, buff, constraint + 1, \
82 MAX_ALLOWED_FOR_STORAGE(tcache))); \
83 } else { \
84 field = static_cast<const char *>(ha_storage_put_str_memlim( \
85 (tcache)->storage, data, MAX_ALLOWED_FOR_STORAGE(tcache))); \
86 } \
87 } while (0)
88
89/** This structure represents INFORMATION_SCHEMA.innodb_locks row */
91 /** The unique identifier of this lock, which does not change over time for a
92 single lock request and no two lock requests ever have the same guid. */
94
95 /** Information for record locks. All these are
96 ULINT_UNDEFINED for table locks. */
97 /** @{ */
98 space_id_t lock_space; /*!< tablespace identifier */
99 page_no_t lock_page; /*!< page number within the_space */
100 ulint lock_rec; /*!< heap number of the record
101 on the page */
102 /** @} */
103
104 /** The following are auxiliary and not included in the table */
105 /** @{ */
107 /*!< table identifier from
108 lock_get_table_id */
109 /** @} */
110};
111
112/** This structure represents INFORMATION_SCHEMA.innodb_trx row */
114 trx_id_t trx_id; /*!< transaction identifier */
115 const char *trx_state; /*!< transaction state from
116 trx_get_que_state_str() */
117 std::chrono::system_clock::time_point trx_started; /*!< trx_t::start_time */
119 /*!< pointer to a row
120 in innodb_locks if trx
121 is waiting, or NULL */
122
123 /** The value of trx->lock.wait_started */
124 std::chrono::system_clock::time_point trx_wait_started;
125 /** The value of TRX_WEIGHT(trx) */
126 uintmax_t trx_weight;
127 /** If `first` is `true` then `second` is the value of the
128 trx->lock.schedule_weight, otherwise the `second` should be ignored and
129 displayed as NULL to the end user.
130 (This could be std::optional once we move to C++17) */
131 std::pair<bool, trx_schedule_weight_t> trx_schedule_weight;
132 ulint trx_mysql_thread_id; /*!< thd_get_thread_id() */
133 const char *trx_query; /*!< MySQL statement being
134 executed in the transaction */
135 const CHARSET_INFO *trx_query_cs; /*!< the charset of trx_query */
136 const char *trx_operation_state; /*!< trx_t::op_info */
137 ulint trx_tables_in_use; /*!< n_mysql_tables_in_use in
138 trx_t */
140 /*!< mysql_n_tables_locked in
141 trx_t */
142 ulint trx_lock_structs; /*!< list len of trx_locks in
143 trx_t */
145 /*!< mem_heap_get_size(
146 trx->lock_heap) */
147 ulint trx_rows_locked; /*!< lock_number_of_rows_locked() */
148 uintmax_t trx_rows_modified; /*!< trx_t::undo_no */
150 /*!< n_tickets_to_enter_innodb in
151 trx_t */
153 /*!< isolation_level in trx_t */
155 /*!< check_unique_secondary in trx_t*/
157 /*!< check_foreigns in trx_t */
159 /*!< detailed_error in trx_t */
161 /*!< has_search_latch in trx_t */
163 /*!< trx_t::read_only */
165 /*!< trx_is_autocommit_non_locking(trx)
166 */
167};
168
169/** Cache of INFORMATION_SCHEMA table data */
170struct trx_i_s_cache_t;
171
172/** Auxiliary enum used by functions that need to select one of the
173INFORMATION_SCHEMA tables */
175 I_S_INNODB_TRX, /*!< INFORMATION_SCHEMA.innodb_trx */
176};
177
178/** This is the intermediate buffer where data needed to fill the
179INFORMATION SCHEMA tables is fetched and later retrieved by the C++
180code in handler/i_s.cc. */
182
183/** Initialize INFORMATION SCHEMA trx related cache. */
184void trx_i_s_cache_init(trx_i_s_cache_t *cache); /*!< out: cache to init */
185/** Free the INFORMATION SCHEMA trx related cache. */
186void trx_i_s_cache_free(trx_i_s_cache_t *cache); /*!< in/out: cache to free */
187
188/** Issue a shared/read lock on the tables cache. */
189void trx_i_s_cache_start_read(trx_i_s_cache_t *cache); /*!< in: cache */
190
191/** Release a shared/read lock on the tables cache. */
192void trx_i_s_cache_end_read(trx_i_s_cache_t *cache); /*!< in: cache */
193
194/** Issue an exclusive/write lock on the tables cache. */
195void trx_i_s_cache_start_write(trx_i_s_cache_t *cache); /*!< in: cache */
196
197/** Release an exclusive/write lock on the tables cache. */
198void trx_i_s_cache_end_write(trx_i_s_cache_t *cache); /*!< in: cache */
199
200/** Retrieves the number of used rows in the cache for a given
201 INFORMATION SCHEMA table.
202 @return number of rows */
203ulint trx_i_s_cache_get_rows_used(trx_i_s_cache_t *cache, /*!< in: cache */
204 enum i_s_table table); /*!< in: which table */
205
206/** Retrieves the nth row in the cache for a given INFORMATION SCHEMA
207 table.
208 @return row */
209void *trx_i_s_cache_get_nth_row(trx_i_s_cache_t *cache, /*!< in: cache */
210 enum i_s_table table, /*!< in: which table */
211 ulint n); /*!< in: row number */
212
213/** Update the transactions cache if it has not been read for some time.
214 @return 0 - fetched, 1 - not */
216 trx_i_s_cache_t *cache); /*!< in/out: cache */
217
218/** Returns true if the data in the cache is truncated due to the memory
219 limit posed by TRX_I_S_MEM_LIMIT.
220 @param[in] cache The cache
221 @return true if truncated */
223
224/** The maximum length of a resulting lock_id_size in
225trx_i_s_create_lock_id(), not including the terminating NUL.
226"%lu:%lu:%lu:%lu:%lu:%lu" -> 20*6+5 chars */
227constexpr uint32_t TRX_I_S_LOCK_ID_MAX_LEN = 20 * 6 + 5;
228
229/** Crafts a lock id string from a i_s_locks_row_t object. Returns its
230 second argument. This function aborts if there is not enough space in
231 lock_id. Be sure to provide at least TRX_I_S_LOCK_ID_MAX_LEN + 1 if you
232 want to be 100% sure that it will not abort.
233 @param[in] row
234 The description of the lock sufficient to populate a row
235 @param[out] lock_id
236 The buffer to store the resulting lock_id
237 @param[in] lock_id_size
238 The size of the lock_id buffer
239 @return resulting lock id */
240char *trx_i_s_create_lock_id(const i_s_locks_row_t &row, char *lock_id,
241 size_t lock_id_size);
242
243/** Fill performance schema lock data.
244Create a string that represents the LOCK_DATA
245column, for a given lock record.
246@param[out] lock_data Lock data string
247@param[in] lock Lock to inspect
248@param[in] heap_no Lock heap number
249@param[in] container Data container to fill
250*/
251void p_s_fill_lock_data(const char **lock_data, const lock_t *lock,
252 ulint heap_no,
254
255/** Fills i_s_locks_row_t object with data about the lock.
256@param[out] row Result object that's filled
257@param[in] lock Lock to get data from
258@param[in] heap_no Lock's record number or ULINT_UNDEFINED if the lock is a
259 table lock */
260void fill_locks_row(i_s_locks_row_t *row, const lock_t *lock, ulint heap_no);
261
262/** Parses lock id into row
263@param[in] lock_id Lock id generated with trx_i_s_create_lock_id
264@param[out] row Row to be filled in with data
265@return LOCK_REC, LOCK_TABLE or 0 if failed to parse */
266int trx_i_s_parse_lock_id(const char *lock_id, i_s_locks_row_t *row);
267#endif /* trx0i_s_h */
uint32_t space_id_t
Tablespace identifier.
Definition: api0api.h:52
uint32_t page_no_t
Page number.
Definition: api0api.h:50
Server interface, row lock container.
Definition: psi_data_lock.h:117
Data dictionary global types.
ib_id_t table_id_t
Table or partition identifier (unique within an InnoDB instance).
Definition: dict0types.h:232
Definition: atomics_array.h:39
Provides atomic access in shared-exclusive modes.
Definition: shared_spin_lock.h:79
Definition: m_ctype.h:385
This structure represents INFORMATION_SCHEMA.innodb_locks row.
Definition: trx0i_s.h:90
space_id_t lock_space
Information for record locks.
Definition: trx0i_s.h:98
ulint lock_rec
heap number of the record on the page
Definition: trx0i_s.h:100
lock_guid_t lock_guid
The unique identifier of this lock, which does not change over time for a single lock request and no ...
Definition: trx0i_s.h:93
table_id_t lock_table_id
The following are auxiliary and not included in the table.
Definition: trx0i_s.h:106
page_no_t lock_page
page number within the_space
Definition: trx0i_s.h:99
This structure represents INFORMATION_SCHEMA.innodb_trx row.
Definition: trx0i_s.h:113
ulint trx_lock_memory_bytes
mem_heap_get_size( trx->lock_heap)
Definition: trx0i_s.h:144
ulint trx_rows_locked
lock_number_of_rows_locked()
Definition: trx0i_s.h:147
std::chrono::system_clock::time_point trx_started
trx_t::start_time
Definition: trx0i_s.h:117
const char * trx_isolation_level
isolation_level in trx_t
Definition: trx0i_s.h:152
bool trx_unique_checks
check_unique_secondary in trx_t
Definition: trx0i_s.h:154
std::pair< bool, trx_schedule_weight_t > trx_schedule_weight
If first is true then second is the value of the trx->lock.schedule_weight, otherwise the second shou...
Definition: trx0i_s.h:131
ulint trx_tables_locked
mysql_n_tables_locked in trx_t
Definition: trx0i_s.h:139
const char * trx_state
transaction state from trx_get_que_state_str()
Definition: trx0i_s.h:115
ulint trx_concurrency_tickets
n_tickets_to_enter_innodb in trx_t
Definition: trx0i_s.h:149
bool trx_has_search_latch
has_search_latch in trx_t
Definition: trx0i_s.h:160
const char * trx_foreign_key_error
detailed_error in trx_t
Definition: trx0i_s.h:158
const CHARSET_INFO * trx_query_cs
the charset of trx_query
Definition: trx0i_s.h:135
trx_id_t trx_id
transaction identifier
Definition: trx0i_s.h:114
const char * trx_operation_state
trx_t::op_info
Definition: trx0i_s.h:136
ulint trx_mysql_thread_id
thd_get_thread_id()
Definition: trx0i_s.h:132
ulint trx_is_read_only
trx_t::read_only
Definition: trx0i_s.h:162
ulint trx_lock_structs
list len of trx_locks in trx_t
Definition: trx0i_s.h:142
ulint trx_tables_in_use
n_mysql_tables_in_use in trx_t
Definition: trx0i_s.h:137
bool trx_foreign_key_checks
check_foreigns in trx_t
Definition: trx0i_s.h:156
ulint trx_is_autocommit_non_locking
trx_is_autocommit_non_locking(trx)
Definition: trx0i_s.h:164
const char * trx_query
MySQL statement being executed in the transaction.
Definition: trx0i_s.h:133
std::chrono::system_clock::time_point trx_wait_started
The value of trx->lock.wait_started.
Definition: trx0i_s.h:124
const i_s_locks_row_t * requested_lock_row
pointer to a row in innodb_locks if trx is waiting, or NULL
Definition: trx0i_s.h:118
uintmax_t trx_weight
The value of TRX_WEIGHT(trx)
Definition: trx0i_s.h:126
uintmax_t trx_rows_modified
trx_t::undo_no
Definition: trx0i_s.h:148
Used to represent locks requests uniquely over time.
Definition: lock0types.h:106
Lock struct; protected by lock_sys latches.
Definition: lock0priv.h:137
This structure describes the intermediate buffer.
Definition: trx0i_s.cc:131
void trx_i_s_cache_end_read(trx_i_s_cache_t *cache)
Release a shared/read lock on the tables cache.
Definition: trx0i_s.cc:988
void trx_i_s_cache_start_read(trx_i_s_cache_t *cache)
Issue a shared/read lock on the tables cache.
Definition: trx0i_s.cc:982
constexpr uint32_t TRX_I_S_MEM_LIMIT
The maximum amount of memory that can be consumed by innodb_trx, innodb_locks and innodb_lock_waits i...
Definition: trx0i_s.h:49
void * trx_i_s_cache_get_nth_row(trx_i_s_cache_t *cache, enum i_s_table table, ulint n)
Retrieves the nth row in the cache for a given INFORMATION SCHEMA table.
Definition: trx0i_s.cc:1050
void trx_i_s_cache_start_write(trx_i_s_cache_t *cache)
Issue an exclusive/write lock on the tables cache.
Definition: trx0i_s.cc:999
void fill_locks_row(i_s_locks_row_t *row, const lock_t *lock, ulint heap_no)
Fills i_s_locks_row_t object with data about the lock.
Definition: trx0i_s.cc:649
bool trx_i_s_cache_is_truncated(trx_i_s_cache_t *cache)
Returns true if the data in the cache is truncated due to the memory limit posed by TRX_I_S_MEM_LIMIT...
Definition: trx0i_s.cc:933
constexpr uint32_t TRX_I_S_TRX_FK_ERROR_MAX_LEN
The maximum length of a string that can be stored in i_s_trx_row_t::trx_foreign_key_error.
Definition: trx0i_s.h:65
trx_i_s_cache_t * trx_i_s_cache
This is the intermediate buffer where data needed to fill the INFORMATION SCHEMA tables is fetched an...
Definition: trx0i_s.cc:161
constexpr uint32_t TRX_I_S_TRX_ISOLATION_LEVEL_MAX_LEN
The maximum length of a string that can be stored in i_s_trx_row_t::trx_isolation_level.
Definition: trx0i_s.h:69
ulint trx_i_s_cache_get_rows_used(trx_i_s_cache_t *cache, enum i_s_table table)
Retrieves the number of used rows in the cache for a given INFORMATION SCHEMA table.
Definition: trx0i_s.cc:1037
int trx_i_s_possibly_fetch_data_into_cache(trx_i_s_cache_t *cache)
Update the transactions cache if it has not been read for some time.
Definition: trx0i_s.cc:912
constexpr uint32_t TRX_I_S_TRX_OP_STATE_MAX_LEN
The maximum length of a string that can be stored in i_s_trx_row_t::trx_operation_state.
Definition: trx0i_s.h:61
constexpr uint32_t TRX_I_S_TRX_QUERY_MAX_LEN
The maximum length of a string that can be stored in i_s_trx_row_t::trx_query.
Definition: trx0i_s.h:57
void trx_i_s_cache_end_write(trx_i_s_cache_t *cache)
Release an exclusive/write lock on the tables cache.
Definition: trx0i_s.cc:1005
constexpr uint32_t TRX_I_S_LOCK_ID_MAX_LEN
The maximum length of a resulting lock_id_size in trx_i_s_create_lock_id(), not including the termina...
Definition: trx0i_s.h:227
void trx_i_s_cache_free(trx_i_s_cache_t *cache)
Free the INFORMATION SCHEMA trx related cache.
Definition: trx0i_s.cc:970
int trx_i_s_parse_lock_id(const char *lock_id, i_s_locks_row_t *row)
Parses lock id into row.
Definition: trx0i_s.cc:1118
i_s_table
Auxiliary enum used by functions that need to select one of the INFORMATION_SCHEMA tables.
Definition: trx0i_s.h:174
@ I_S_INNODB_TRX
INFORMATION_SCHEMA.innodb_trx.
Definition: trx0i_s.h:175
char * trx_i_s_create_lock_id(const i_s_locks_row_t &row, char *lock_id, size_t lock_id_size)
Crafts a lock id string from a i_s_locks_row_t object.
Definition: trx0i_s.cc:1084
constexpr uint32_t TRX_I_S_LOCK_DATA_MAX_LEN
The maximum length of a string that can be stored in i_s_locks_row_t::lock_data.
Definition: trx0i_s.h:53
void p_s_fill_lock_data(const char **lock_data, const lock_t *lock, ulint heap_no, PSI_server_data_lock_container *container)
Fill performance schema lock data.
Definition: trx0i_s.cc:584
void trx_i_s_cache_init(trx_i_s_cache_t *cache)
Initialize INFORMATION SCHEMA trx related cache.
Definition: trx0i_s.cc:938
Transaction system global type definitions.
ib_id_t trx_id_t
Transaction identifier (DB_TRX_ID, DATA_TRX_ID)
Definition: trx0types.h:138
Version control for database, common definitions, and include files.
unsigned long int ulint
Definition: univ.i:406
int n
Definition: xcom_base.cc:509