mirror of
https://github.com/MariaDB/server.git
synced 2025-07-27 18:02:13 +03:00
Merge 10.4 into 10.5
Signed-off-by: Kristian Nielsen <knielsen@knielsen-hq.org>
This commit is contained in:
@ -5331,12 +5331,6 @@ thd_need_wait_reports(const MYSQL_THD thd)
|
||||
deadlock with the pre-determined commit order, we kill the later
|
||||
transaction, and later re-try it, to resolve the deadlock.
|
||||
|
||||
This call need only receive reports about waits for locks that will remain
|
||||
until the holding transaction commits. InnoDB auto-increment locks,
|
||||
for example, are released earlier, and so need not be reported. (Such false
|
||||
positives are not harmful, but could lead to unnecessary kill and retry, so
|
||||
best avoided).
|
||||
|
||||
Returns 1 if the OTHER_THD will be killed to resolve deadlock, 0 if not. The
|
||||
actual kill will happen later, asynchronously from another thread. The
|
||||
caller does not need to take any actions on the return value if the
|
||||
@ -5465,6 +5459,49 @@ thd_need_ordering_with(const MYSQL_THD thd, const MYSQL_THD other_thd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
If the storage engine detects a deadlock, and needs to choose a victim
|
||||
transaction to roll back, it can call this function to ask the upper
|
||||
server layer for which of two possible transactions is prefered to be
|
||||
aborted and rolled back.
|
||||
|
||||
In parallel replication, if two transactions are running in parallel and
|
||||
one is fixed to commit before the other, then the one that commits later
|
||||
will be prefered as the victim - chosing the early transaction as a victim
|
||||
will not resolve the deadlock anyway, as the later transaction still needs
|
||||
to wait for the earlier to commit.
|
||||
|
||||
The return value is -1 if the first transaction is prefered as a deadlock
|
||||
victim, 1 if the second transaction is prefered, or 0 for no preference (in
|
||||
which case the storage engine can make the choice as it prefers).
|
||||
*/
|
||||
extern "C" int
|
||||
thd_deadlock_victim_preference(const MYSQL_THD thd1, const MYSQL_THD thd2)
|
||||
{
|
||||
rpl_group_info *rgi1, *rgi2;
|
||||
|
||||
if (!thd1 || !thd2)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
If the transactions are participating in the same replication domain in
|
||||
parallel replication, then request to select the one that will commit
|
||||
later (in the fixed commit order from the master) as the deadlock victim.
|
||||
*/
|
||||
rgi1= thd1->rgi_slave;
|
||||
rgi2= thd2->rgi_slave;
|
||||
if (rgi1 && rgi2 &&
|
||||
rgi1->is_parallel_exec &&
|
||||
rgi1->rli == rgi2->rli &&
|
||||
rgi1->current_gtid.domain_id == rgi2->current_gtid.domain_id)
|
||||
return rgi1->gtid_sub_id < rgi2->gtid_sub_id ? 1 : -1;
|
||||
|
||||
/* No preferences, let the storage engine decide. */
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
extern "C" int thd_non_transactional_update(const MYSQL_THD thd)
|
||||
{
|
||||
return(thd->transaction->all.modified_non_trans_table);
|
||||
|
Reference in New Issue
Block a user