Först och främst finns det en bugg i din implementering. Om en fråga misslyckas rullas den aktuella transaktionen automatiskt tillbaka och stängs sedan. Så när du fortsätter att köra frågor kommer de inte att finnas i en transaktion (de kommer att vara engagerade i DB). Sedan, när du kör Rollback
, kommer det att misslyckas tyst. Från MySQL-dokumenten
:
Rolling back can be a slow operation that may occur implicitly without the user
having explicitly asked for it (for example, when an error occurs).
Det explicita kommandot ROLLBACK
bör endast användas om du i programmet bestämmer att du behöver återställa (av andra skäl än ett frågefel). Till exempel, om du drar pengar från ett konto, skulle du uttryckligen återställa om du fick reda på att användaren inte hade tillräckligt med pengar för att slutföra utbytet...
När det gäller att testa transaktionerna kopierar jag databasen. Jag skapar en ny databas och installerar en uppsättning "dummy data". Sedan kör jag alla tester med hjälp av ett automatiserat verktyg. Verktyget kommer faktiskt att utföra transaktionerna och tvinga fram återställningar och kontrollera att det förväntade databastillståndet bibehålls under testerna. Eftersom det är svårare att programmässigt veta sluttillståndet från en transaktion om du har en okänd indata till transaktionen, kommer det inte att bli lätt att testa livedata (eller till och med kopierad från live). Du kan göra det (och bör), men lita inte på dessa resultat för att avgöra om ditt system fungerar. Använd dessa resultat för att skapa nya testfall för den automatiska testaren...