То, что вы говорите, зависит от вызываемого кода, возвращает ли он вам флаг для проверки или он генерирует исключительные ситуации, если что-то идет не так?
API генерирует исключения, но также возвращает логическое значение (true | false):
Такая ситуация часто возникает, и вызывающему коду трудно обрабатывать обаусловия, как вы указали в своем ОП.Единственное, что вы можете сделать в этой ситуации:
// Initialize a var we can test against later
// Lol, didn't realize this was for java, please excuse the var
// initialization, as it's demonstrative only
$queryStatus = false;
try {
if (deleteById(2)) {
$queryStatus = true;
} else {
// I can do a few things here
// Skip it, because the $queryStatus was initialized as false, so
// nothing changes
// Or throw an exception to be caught
throw new SQLException('Delete failed');
}
} catch (SQLException $e) {
// This can also be skipped, because the $queryStatus was initialized as
// false, however you may want to do some logging
error_log($e->getMessage());
}
// Because we have a converged variable which covers both cases where the API
// may return a bool, or throw an exception we can test the value and determine
// whether rollback or commit
if (true === $queryStatus) {
commit();
} else {
rollback();
}
API генерирует исключительно исключения (без возвращаемого значения) :
Нет проблем.Можно предположить, что если исключение не было обнаружено, операция завершилась без ошибок, и мы можем добавить rollback () / commit () в блок try / catch.
try {
deleteById(2);
// Because the API dev had a good grasp of error handling by using
// exceptions, we can also do some other calls
updateById(7);
insertByName('Chargers rule');
// No exception thrown from above API calls? sweet, lets commit
commit();
} catch (SQLException $e) {
// Oops exception was thrown from API, lets roll back
rollback();
}
API не генерирует никакихисключения, только возвращает bool (true | false):
Это возвращает нас к обработке и проверке ошибок старой школы
if (deleteById(2)) {
commit();
} else {
rollback();
}
Если у вас есть несколько запросов, составляющих транзакцию,Вы можете заимствовать идею единственной переменной из сценария № 1:
$queryStatus = true;
if (!deleteById(2)) {
$queryStatus = false;
}
if (!updateById(7)) {
$queryStatus = false;
}
...
if (true === $queryStatus) {
commit();
} else {
rollback();
}
"Примечание. Предположим, что автоматическая фиксация отключена."
- После отключения автоматической фиксации высообщаем СУБД, что вы берете контроль над коммитами с этого момента до тех пор, пока автоматическая фиксация не будет повторно включена, поэтому, IMO, рекомендуется откатывать или фиксировать транзакцию, а не оставлять любые запросы в подвешенном состоянии.