Обычно приблуды для специфичного языка кроме исполнения двух написанных пользователем SQL’ей (накатить и откатить) предоставляют свой DSL, который миграции упрощает (и которого никогда ни на что не хватает, и поэтому ты все равно пишешь два SQL’я).
Если в запросе на вставку есть подзапрос на чтение, будет ли он выполнен, если таблица для основного запроса заблокирована на запись (другим запросом)?