На първо място, има грешка във вашата реализация. Ако заявка възникне грешка, текущата транзакция автоматично се връща назад и след това се затваря. Така че, докато продължавате да изпълнявате заявки, те няма да бъдат в рамките на транзакция (те ще бъдат ангажирани към DB). След това, когато изпълните Rollback
, безшумно ще се провали. От документите на MySQL
:
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).
Изричната команда ROLLBACK
трябва да се използва само ако определите в приложението, че трябва да връщате назад (по причини, различни от грешка в заявката). Например, ако приспадате средства от сметка, вие изрично ще върнете обратно, ако разберете, че потребителят няма достатъчно средства, за да завърши обмена...
Що се отнася до тестването на транзакциите, аз копирам базата данни. Създавам нова база данни и инсталирам набор от "фиктивни данни". След това изпълнявам всички тестове с помощта на автоматизиран инструмент. Инструментът действително ще извърши транзакциите и ще принуди връщане назад и ще провери дали очакваното състояние на базата данни се поддържа по време на тестовете. Тъй като е по-трудно програмно да се знае крайното състояние от транзакция, ако имате неизвестен вход към транзакцията, тестването на живи (или дори копирани от живи) данни няма да бъде лесно. Можете да го направите (и трябва), но не разчитайте на тези резултати, за да определите дали вашата система работи. Използвайте тези резултати, за да създадете нови тестови случаи за автоматизирания тестер...