updateWithRollback

suspend fun <T : CacheableInput> updateWithRollback(updates: Map<out T, Any?>, action: suspend () -> Unit): Any

Run the action as a transaction, first performing updates. If action doesn't succeed, perform a rollback of all the values of the given keys. The caller MUST use setUnsafe() internally since we already hold the per-key mutexes — calling set() would deadlock.