runTransaction
(1) Creates a Transaction, (2) invokes block, and (3) runs a data update, returning once the update is complete. Between steps 2 and 3, if there’s already an update in progress, the current coroutine is suspended until the ongoing update’s completion.