MySQL 9.0.0
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 "lock0types.h"
43#include "trx0types.h"
44#include "univ.i"
45
47
48struct CHARSET_INFO;
49
50/** The maximum amount of memory that can be consumed by innodb_trx,
51innodb_locks and innodb_lock_waits information schema tables. */
52constexpr uint32_t TRX_I_S_MEM_LIMIT = 16777216; /* 16 MiB */
53
54/** The maximum length of a string that can be stored in
55i_s_locks_row_t::lock_data */
56constexpr uint32_t TRX_I_S_LOCK_DATA_MAX_LEN = 8192;
57
58/** The maximum length of a string that can be stored in
59i_s_trx_row_t::trx_query */
60constexpr uint32_t TRX_I_S_TRX_QUERY_MAX_LEN = 1024;
61
62/** The maximum length of a string that can be stored in
63i_s_trx_row_t::trx_operation_state */
64constexpr uint32_t TRX_I_S_TRX_OP_STATE_MAX_LEN = 64;
65
66/** The maximum length of a string that can be stored in
67i_s_trx_row_t::trx_foreign_key_error */
68constexpr uint32_t TRX_I_S_TRX_FK_ERROR_MAX_LEN = 256;
69
70/** The maximum length of a string that can be stored in
71i_s_trx_row_t::trx_isolation_level */
73
74/** Safely copy strings in to the INNODB_TRX table's
75string based columns */
76#define TRX_I_S_STRING_COPY(data, field, constraint, tcache) \
77 do { \
78 if (strlen(data) > constraint) { \
79 char buff[constraint + 1]; \
80 strncpy(buff, data, constraint); \
81 buff[constraint] = '\0'; \
82 \
83 field = static_cast<const char *>( \
84 ha_storage_put_memlim((tcache)->storage, buff, constraint + 1, \
85 MAX_ALLOWED_FOR_STORAGE(tcache))); \
86 } else { \
87 field = static_cast<const char *>(ha_storage_put_str_memlim( \
88 (tcache)->storage, data, MAX_ALLOWED_FOR_STORAGE(tcache))); \
89 } \
90 } while (0)
91
92/** This structure represents INFORMATION_SCHEMA.innodb_locks row */
94 uint64_t lock_trx_immutable_id; /*!< transaction address as integer. We need
95 an id which is unique and does not change over time.
96 Unfortunately trx->id is initially equal to 0 for
97 all trxs which still appear to be read only, and it
98 changes to non-zero, once trx needs to perform write.
99 For this reason trx->id is not good enough for our
100 purpose. */
101 uint64_t lock_immutable_id; /*!< lock address as integer. We need to identify
102 the lock in unique way. Specifying space, page and heap_no
103 and trx is not enough, because there could be locks with
104 different modes. Using mode as part of id is not good,
105 because we sometimes change the mode of the lock (for
106 example when granting the lock we drop LOCK_WAITING flag
107 and in lock_trx_release_read_locks we add LOCK_REC_NOT_GAP
108 flag). The only permanent thing is then the address.
109 We use both lock_immutable_id and lock_trx_immutable_id
110 even though lock_immutable_id is unique, because we need
111 to be able to locate the row in PERFORMANCE_SCHEMA based
112 on the id, and we need a way to verify that the
113 lock_immutable_id is safe to dereference. Simplest way to
114 do that is to check that trx still has the lock on its
115 list of locks. */
116
117 /** Information for record locks. All these are
118 ULINT_UNDEFINED for table locks. */
119 /** @{ */
120 space_id_t lock_space; /*!< tablespace identifier */
121 page_no_t lock_page; /*!< page number within the_space */
122 ulint lock_rec; /*!< heap number of the record
123 on the page */
124 /** @} */
125
126 /** The following are auxiliary and not included in the table */
127 /** @{ */
129 /*!< table identifier from
130 lock_get_table_id */
131 /** @} */
132};
133
134/** This structure represents INFORMATION_SCHEMA.innodb_trx row */
136 /** transaction identifier */
138
139 /** transaction state from trx_get_que_state_str()*/
140 const char *trx_state;
141
142 /** trx_t::start_time */
143 std::chrono::system_clock::time_point trx_started;
144
145 /** a description of lock request if trx is waiting, or nullptr otherwise */
147
148 /** The value of trx->lock.wait_started */
149 std::chrono::system_clock::time_point trx_wait_started;
150
151 /** The value of TRX_WEIGHT(trx) */
152 uintmax_t trx_weight;
153
154 /** If `first` is `true` then `second` is the value of the
155 trx->lock.schedule_weight, otherwise the `second` should be ignored and
156 displayed as NULL to the end user.
157 (This could be std::optional once we move to C++17) */
158 std::pair<bool, trx_schedule_weight_t> trx_schedule_weight;
159
160 /** thd_get_thread_id() */
162
163 /** TRX_I_S_TRX_QUERY_MAX_LEN byte prefix of MySQL statement being executed
164 in the transaction */
165 const char *trx_query;
166
167 /** the charset of trx_query */
169
170 /** trx_t::op_info */
172
173 /** n_mysql_tables_in_use in trx_t*/
175
176 /** mysql_n_tables_locked in trx_t */
178
179 /** list len of trx_locks in trx_t */
181
182 /** mem_heap_get_size(trx->lock_heap) */
184
185 /** lock_number_of_rows_locked() */
187
188 /** trx_t::undo_no */
190
191 /** n_tickets_to_enter_innodb in trx_t */
193
194 /** isolation_level in trx_t */
196
197 /** check_unique_secondary in trx_t */
199
200 /** check_foreigns in trx_t */
202
203 /** detailed_error in trx_t */
205
206 /** has_search_latch in trx_t */
208
209 /** trx_t::read_only */
211
212 /** trx_is_autocommit_non_locking(trx) */
214};
215
216/** Cache of INFORMATION_SCHEMA table data */
217struct trx_i_s_cache_t;
218
219/** Auxiliary enum used by functions that need to select one of the
220INFORMATION_SCHEMA tables */
222 I_S_INNODB_TRX, /*!< INFORMATION_SCHEMA.innodb_trx */
223};
224
225/** This is the intermediate buffer where data needed to fill the
226INFORMATION SCHEMA tables is fetched and later retrieved by the C++
227code in handler/i_s.cc. */
229
230/** Initialize INFORMATION SCHEMA trx related cache. */
231void trx_i_s_cache_init(trx_i_s_cache_t *cache); /*!< out: cache to init */
232/** Free the INFORMATION SCHEMA trx related cache. */
233void trx_i_s_cache_free(trx_i_s_cache_t *cache); /*!< in/out: cache to free */
234
235/** Issue a shared/read lock on the tables cache. */
236void trx_i_s_cache_start_read(trx_i_s_cache_t *cache); /*!< in: cache */
237
238/** Release a shared/read lock on the tables cache. */
239void trx_i_s_cache_end_read(trx_i_s_cache_t *cache); /*!< in: cache */
240
241/** Issue an exclusive/write lock on the tables cache. */
242void trx_i_s_cache_start_write(trx_i_s_cache_t *cache); /*!< in: cache */
243
244/** Release an exclusive/write lock on the tables cache. */
245void trx_i_s_cache_end_write(trx_i_s_cache_t *cache); /*!< in: cache */
246
247/** Retrieves the number of used rows in the cache for a given
248 INFORMATION SCHEMA table.
249 @return number of rows */
250ulint trx_i_s_cache_get_rows_used(trx_i_s_cache_t *cache, /*!< in: cache */
251 enum i_s_table table); /*!< in: which table */
252
253/** Retrieves the nth row in the cache for a given INFORMATION SCHEMA
254 table.
255 @return row */
256void *trx_i_s_cache_get_nth_row(trx_i_s_cache_t *cache, /*!< in: cache */
257 enum i_s_table table, /*!< in: which table */
258 ulint n); /*!< in: row number */
259
260/** Update the transactions cache if it has not been read for some time.
261 @return 0 - fetched, 1 - not */
263 trx_i_s_cache_t *cache); /*!< in/out: cache */
264
265/** Returns true if the data in the cache is truncated due to the memory
266 limit posed by TRX_I_S_MEM_LIMIT.
267 @param[in] cache The cache
268 @return true if truncated */
270
271/** The maximum length of a resulting lock_id_size in
272trx_i_s_create_lock_id(), not including the terminating NUL.
273"%lu:%lu:%lu:%lu:%lu" -> 20*5+4 chars */
274constexpr uint32_t TRX_I_S_LOCK_ID_MAX_LEN = 20 * 5 + 4;
275
276/** Crafts a lock id string from a i_s_locks_row_t object. Returns its
277 second argument. This function aborts if there is not enough space in
278 lock_id. Be sure to provide at least TRX_I_S_LOCK_ID_MAX_LEN + 1 if you
279 want to be 100% sure that it will not abort.
280 @param[in] row
281 The description of the lock sufficient to populate a row
282 @param[out] lock_id
283 The buffer to store the resulting lock_id
284 @param[in] lock_id_size
285 The size of the lock_id buffer
286 @return resulting lock id */
287char *trx_i_s_create_lock_id(const i_s_locks_row_t &row, char *lock_id,
288 size_t lock_id_size);
289
290/** Fill performance schema lock data.
291Create a string that represents the LOCK_DATA
292column, for a given lock record.
293@param[out] lock_data Lock data string
294@param[in] lock Lock to inspect
295@param[in] heap_no Lock heap number
296@param[in] container Data container to fill
297*/
298void p_s_fill_lock_data(const char **lock_data, const lock_t *lock,
299 ulint heap_no,
301
302/** Fills i_s_locks_row_t object with data about the lock.
303@param[out] row Result object that's filled
304@param[in] lock Lock to get data from
305@param[in] heap_no Lock's record number or ULINT_UNDEFINED if the lock is a
306 table lock */
307void fill_locks_row(i_s_locks_row_t *row, const lock_t *lock, ulint heap_no);
308
309/** Parses lock id into row
310@param[in] lock_id Lock id generated with trx_i_s_create_lock_id
311@param[out] row Row to be filled in with data
312@return LOCK_REC, LOCK_TABLE or 0 if failed to parse */
313int trx_i_s_parse_lock_id(const char *lock_id, i_s_locks_row_t *row);
314#endif /* trx0i_s_h */
uint32_t space_id_t
Tablespace identifier.
Definition: api0api.h:47
uint32_t page_no_t
Page number.
Definition: api0api.h:45
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
The transaction lock system global types.
static PFS_engine_table_share_proxy table
Definition: pfs.cc:61
Definition: atomics_array.h:39
Provides atomic access in shared-exclusive modes.
Definition: shared_spin_lock.h:79
Definition: m_ctype.h:421
This structure represents INFORMATION_SCHEMA.innodb_locks row.
Definition: trx0i_s.h:93
uint64_t lock_immutable_id
lock address as integer.
Definition: trx0i_s.h:101
space_id_t lock_space
Information for record locks.
Definition: trx0i_s.h:120
ulint lock_rec
heap number of the record on the page
Definition: trx0i_s.h:122
table_id_t lock_table_id
The following are auxiliary and not included in the table.
Definition: trx0i_s.h:128
uint64_t lock_trx_immutable_id
transaction address as integer.
Definition: trx0i_s.h:94
page_no_t lock_page
page number within the_space
Definition: trx0i_s.h:121
This structure represents INFORMATION_SCHEMA.innodb_trx row.
Definition: trx0i_s.h:135
ulint trx_lock_memory_bytes
mem_heap_get_size(trx->lock_heap)
Definition: trx0i_s.h:183
ulint trx_rows_locked
lock_number_of_rows_locked()
Definition: trx0i_s.h:186
std::chrono::system_clock::time_point trx_started
trx_t::start_time
Definition: trx0i_s.h:143
const char * trx_isolation_level
isolation_level in trx_t
Definition: trx0i_s.h:195
bool trx_unique_checks
check_unique_secondary in trx_t
Definition: trx0i_s.h:198
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:158
ulint trx_tables_locked
mysql_n_tables_locked in trx_t
Definition: trx0i_s.h:177
const char * trx_state
transaction state from trx_get_que_state_str()
Definition: trx0i_s.h:140
ulint trx_concurrency_tickets
n_tickets_to_enter_innodb in trx_t
Definition: trx0i_s.h:192
bool trx_has_search_latch
has_search_latch in trx_t
Definition: trx0i_s.h:207
const char * trx_foreign_key_error
detailed_error in trx_t
Definition: trx0i_s.h:204
const CHARSET_INFO * trx_query_cs
the charset of trx_query
Definition: trx0i_s.h:168
trx_id_t trx_id
transaction identifier
Definition: trx0i_s.h:137
const char * trx_operation_state
trx_t::op_info
Definition: trx0i_s.h:171
ulint trx_mysql_thread_id
thd_get_thread_id()
Definition: trx0i_s.h:161
ulint trx_is_read_only
trx_t::read_only
Definition: trx0i_s.h:210
ulint trx_lock_structs
list len of trx_locks in trx_t
Definition: trx0i_s.h:180
ulint trx_tables_in_use
n_mysql_tables_in_use in trx_t
Definition: trx0i_s.h:174
bool trx_foreign_key_checks
check_foreigns in trx_t
Definition: trx0i_s.h:201
ulint trx_is_autocommit_non_locking
trx_is_autocommit_non_locking(trx)
Definition: trx0i_s.h:213
const char * trx_query
TRX_I_S_TRX_QUERY_MAX_LEN byte prefix of MySQL statement being executed in the transaction.
Definition: trx0i_s.h:165
std::chrono::system_clock::time_point trx_wait_started
The value of trx->lock.wait_started.
Definition: trx0i_s.h:149
const i_s_locks_row_t * requested_lock_row
a description of lock request if trx is waiting, or nullptr otherwise
Definition: trx0i_s.h:146
uintmax_t trx_weight
The value of TRX_WEIGHT(trx)
Definition: trx0i_s.h:152
uintmax_t trx_rows_modified
trx_t::undo_no
Definition: trx0i_s.h:189
Lock struct; protected by lock_sys latches.
Definition: lock0priv.h:136
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:893
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:887
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:52
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:955
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:904
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:651
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:838
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:68
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:167
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:72
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:942
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:817
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:64
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:60
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:910
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:274
void trx_i_s_cache_free(trx_i_s_cache_t *cache)
Free the INFORMATION SCHEMA trx related cache.
Definition: trx0i_s.cc:875
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:1012
i_s_table
Auxiliary enum used by functions that need to select one of the INFORMATION_SCHEMA tables.
Definition: trx0i_s.h:221
@ I_S_INNODB_TRX
INFORMATION_SCHEMA.innodb_trx.
Definition: trx0i_s.h:222
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:986
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:56
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:587
void trx_i_s_cache_init(trx_i_s_cache_t *cache)
Initialize INFORMATION SCHEMA trx related cache.
Definition: trx0i_s.cc:843
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