Проблемът беше, че в момента Quill async не поддържа едновременни операции в транзакции.
Така че трябваше да направя вмъкването на животните последователно:
ctx.transaction { implicit ec =>
for {
personId <- ctx.run(insertPersonQuery)
animals = personCreate.animals.map(Animal.apply(personId, _))
_ <- animals.foldLeft(Future.successful(0l)) {
case (fut, animal) =>
fut.flatMap(_ => insertAnimal(animal))
}
} yield personId
}
освен това, още по-добре е да използвате пакетно вмъкване :)
Благодаря на @fwbrasil и @mentegy за помощта!