Исходный код
string status = ProcessData("db1");
if (status == "ERROR") goto ErrorOccured;
status = ProcessData("db2");
if (status == "ERROR") goto ErrorOccured;
status = ProcessData("db3");
if (status == "ERROR") goto ErrorOccured;
if (status == "OK") goto NoError;
ErrorOccured:
tran.Rollback();
return status;
NoError:
tran.Commit()
Что не так в исходном коде
Исключения уже изобрели, а применение оператора goto
уголовно наказуемо (шутка). Про исключения не шутка.