Av någon anledning trodde jag att den implicita transaktionen entityManager joins var en ny transaktion. Men Vilolägesdokument a> stat:"När du skapar en enhetshanterare i en transaktion ansluter enhetshanteraren automatiskt till den aktuella transaktionen."
Så tydligen finns det en annan transaktion som redan körs (inte överraskande) och mina hämtningsresultat ändras beroende på vad den redan hade läst (eftersom databasen körs i REPEATABLE-READ-läge.)
På kort sikt kommer jag att svepa igenom min kod för att explicit påbörja() transaktioner varhelst det saknas. På längre sikt kommer jag att undersöka Spring Transactions för att se hur transaktioner hanteras på ett mer idiotsäkert sätt (som föreslogs i kommentarerna.)