lock_rec_lock_slow
| | => *wait_for = lock_rec_other_has_conflicting
| | => err = rec_lock.add_to_waitq(wait_for);
| | => lock_create_wait_for_edge
| | => ut_ad(lock_mutex_own());
| | => waiter->lock.blocking_trx.store(blocker);
lock_rec_grant
| | => lock_grant_or_update_wait_for_edge_if_waiting(lock, in_lock->trx);
| | => lock_grant_or_update_wait_for_edge
| | => const lock_t *blocking_lock = lock_has_to_wait_in_queue(lock, nullptr);
//行锁释放后,更新阻塞事务的流程,比如对某一行,t1加了x锁,之后有s\s\x锁进行等待,当t1提交事务,释放锁,后续s\s可以唤醒,x锁所属事务要更新block_trx
| | => if (blocking_lock == !nullptr) lock_update_wait_for_edge(lock, blocking_lock);
| | => ut_ad(lock_mutex_own());
| | => if (waiting_lock->trx->lock.blocking_trx.load() != blocking_lock->trx) {
| | => waiting_lock->trx->lock.blocking_trx.store(blocking_lock->trx);
| | => lock_wait_request_check_for_cycles();
| | => }
| | => else {
| | => lock_grant
| | => lock_reset_wait_and_release_thread_if_suspended
| | => ut_ad(lock_mutex_own());
| | => ut_ad(trx_mutex_own(lock->trx));
| | => lock->trx->lock.blocking_trx.store(nullptr);
| | => lock_wait_release_thread_if_suspended
| | => do slot
| | => }