lock_deadlock_check_and_resolve(
/*============================*/
const lock_t* lock, /*!< in: lock the transaction is requesting */
const trx_t* trx) /*!< in: transaction */
{
/* Try and resolve as many deadlocks as possible. */
do {
lock_deadlock_ctx_t ctx;
/* Reset the context. */
ctx.cost = 0;
ctx.depth = 0;
ctx.start = trx;
ctx.too_deep = FALSE;
ctx.wait_lock = lock;
ctx.mark_start = lock_mark_counter;
//1、死锁检测
victim_trx_id = lock_deadlock_search(&ctx);
//2、如果死锁检测的深度太深,需要回滚当前的事务
if (ctx.too_deep) {
if (!srv_read_only_mode) {
lock_deadlock_joining_trx_print(trx, lock);
}
//2、如果需要回滚的是其他事务,那么调用lock_deadlock_trx_rollback进行回滚
} else if (victim_trx_id != 0 && victim_trx_id != trx->id) {
ut_ad(victim_trx_id ==
InnoDB事务锁之行锁--死锁检测机制
最新推荐文章于 2023-03-03 19:09:10 发布