408
402
is estimated as the number of altered rows + the number of locked rows.
409
403
@param t transaction
410
404
@return transaction weight */
411
#define TRX_WEIGHT(t) ((t)->undo_no + UT_LIST_GET_LEN((t)->trx_locks))
405
#define TRX_WEIGHT(t) \
406
ut_dulint_add((t)->undo_no, UT_LIST_GET_LEN((t)->trx_locks))
413
408
/*******************************************************************//**
414
409
Compares the "weight" (or size) of two transactions. Transactions that
415
410
have edited non-transactional tables are considered heavier than ones
417
@return TRUE if weight(a) >= weight(b) */
412
@return <0, 0 or >0; similar to strcmp(3) */
422
417
const trx_t* a, /*!< in: the first transaction to be compared */
423
418
const trx_t* b); /*!< in: the second transaction to be compared */
420
/*******************************************************************//**
421
Retrieves transacion's id, represented as unsigned long long.
422
@return transaction's id */
427
const trx_t* trx); /*!< in: transaction */
425
429
/* Maximum length of a string that can be returned by
426
430
trx_get_que_state_str(). */
427
431
#define TRX_QUE_STATE_STR_MAX_LEN 12 /* "ROLLING BACK" */
462
466
struct trx_struct{
465
/* These fields are not protected by any mutex. */
468
/* All the next fields are protected by the kernel mutex, except the
469
undo logs which are protected by undo_mutex */
466
470
const char* op_info; /*!< English text describing the
467
471
current operation, or an empty
469
ulint conc_state; /*!< state of the trx from the point
473
unsigned is_purge:1; /*!< 0=user transaction, 1=purge */
474
unsigned is_recovered:1; /*!< 0=normal transaction,
475
1=recovered, must be rolled back */
476
unsigned conc_state:2; /*!< state of the trx from the point
470
477
of view of concurrency control:
471
478
TRX_ACTIVE, TRX_COMMITTED_IN_MEMORY,
473
ulint isolation_level;/* TRX_ISO_REPEATABLE_READ, ... */
474
ulint check_foreigns; /* normally TRUE, but if the user
480
unsigned que_state:2; /*!< valid when conc_state == TRX_ACTIVE:
481
TRX_QUE_RUNNING, TRX_QUE_LOCK_WAIT,
483
unsigned isolation_level:2;/* TRX_ISO_REPEATABLE_READ, ... */
484
unsigned check_foreigns:1;/* normally TRUE, but if the user
475
485
wants to suppress foreign key checks,
476
486
(in table imports, for example) we
477
487
set this FALSE */
478
unsigned check_unique_secondary;
488
unsigned check_unique_secondary:1;
479
489
/* normally TRUE, but if the user
480
490
wants to speed up inserts by
481
491
suppressing unique key checks
482
492
for secondary indexes when we decide
483
493
if we can use the insert buffer for
484
494
them, we set this FALSE */
485
unsigned support_xa; /*!< normally we do the XA two-phase
495
unsigned support_xa:1; /*!< normally we do the XA two-phase
486
496
commit steps, but by setting this to
487
497
FALSE, one can save CPU time and about
488
498
150 bytes in the undo log size as then
489
499
we skip XA steps */
490
unsigned flush_log_later;/* In 2PC, we hold the
500
unsigned flush_log_later:1;/* In 2PC, we hold the
491
501
prepare_commit mutex across
492
502
both phases. In that case, we
493
503
defer flush of the logs to disk
494
504
until after we release the
496
unsigned must_flush_log_later;/* this flag is set to TRUE in
506
unsigned must_flush_log_later:1;/* this flag is set to TRUE in
497
507
trx_commit_off_kernel() if
498
508
flush_log_later was TRUE, and there
499
509
were modifications by the transaction;
500
510
in that case we must flush the log
501
511
in trx_commit_complete_for_mysql() */
502
ulint duplicates; /*!< TRX_DUP_IGNORE | TRX_DUP_REPLACE */
503
ulint active_trans; /*!< 1 - if a transaction in MySQL
504
is active. 2 - if prepare_commit_mutex
506
unsigned has_search_latch;
512
unsigned dict_operation:2;/**< @see enum trx_dict_op */
513
unsigned duplicates:2; /*!< TRX_DUP_IGNORE | TRX_DUP_REPLACE */
514
unsigned has_search_latch:1;
507
515
/* TRUE if this trx has latched the
508
516
search system latch in S-mode */
509
ulint deadlock_mark; /*!< a mark field used in deadlock
510
checking algorithm. */
511
trx_dict_op_t dict_operation; /**< @see enum trx_dict_op */
513
/* Fields protected by the srv_conc_mutex. */
514
ulint declared_to_be_inside_innodb;
517
unsigned declared_to_be_inside_innodb:1;
515
518
/* this is TRUE if we have declared
516
519
this transaction in
517
520
srv_conc_enter_innodb to be inside the
520
/* Fields protected by dict_operation_lock. The very latch
521
it is used to track. */
522
ulint dict_operation_lock_mode;
523
/*!< 0, RW_S_LATCH, or RW_X_LATCH:
522
unsigned handling_signals:1;/* this is TRUE as long as the trx
523
is handling signals */
524
unsigned dict_operation_lock_mode:2;
525
/* 0, RW_S_LATCH, or RW_X_LATCH:
524
526
the latch mode trx currently holds
525
527
on dict_operation_lock */
527
/* All the next fields are protected by the kernel mutex, except the
528
undo logs which are protected by undo_mutex */
529
ulint is_purge; /*!< 0=user transaction, 1=purge */
530
ulint is_recovered; /*!< 0=normal transaction,
531
1=recovered, must be rolled back */
532
ulint que_state; /*!< valid when conc_state
533
== TRX_ACTIVE: TRX_QUE_RUNNING,
534
TRX_QUE_LOCK_WAIT, ... */
535
ulint handling_signals;/* this is TRUE as long as the trx
536
is handling signals */
537
528
time_t start_time; /*!< time the trx object was created
538
529
or the state last time became