Mysql сообщение об ошибке транзакции - PullRequest
1 голос
/ 20 февраля 2012

У меня есть типичная транзакция

START TRANSACTION
INSERT INTO ...
UPDATE ...
DELETE ...
COMMIT

Проблема 1: Ошибка в UPDATE не заблокирует транзакцию.В одном запросе я использую mysql_affected_rows() для проверки успеха UPDATE, но как сделать это в середине транзакции?

Проблема 2: Как определить, какой запрос вызвалостановка транзакции?Чтобы сделать условное заключение в PHP?

1 Ответ

2 голосов
/ 20 февраля 2012

Предполагая, что вы используете функции mysql_*() на основе вашего упоминания mysql_affected_rows(), вы просто должны вызывать каждый этап транзакции в отдельном mysql_query() и проверять ее успех или неудачу на каждом этапе. Если вы не оберните это как хранимую процедуру, вы должны вызывать их как отдельные операторы, так как mysql_query() не поддерживает несколько операторов в одном вызове.

function doTransaction() {
  mysql_query("START TRANSACTION;");
  $ins = mysql_query("INSERT INTO ....");
  if (!$ins) {
    // fail
    mysql_query("ROLLBACK");
    return FALSE;
  }

  $upd = mysql_query("UPDATE...");
  if (!$upd) {
    // fail
    mysql_query("ROLLBACK");
    return FALSE;  
  }
  if (mysql_affected rows() === 0) {
    // no rows updated, rollback if necessary
    mysql_query("ROLLBACK");
    return FALSE;
  }

  $del = mysql_query("DELETE FROM...");
  if (!$del) {
    // fail
    mysql_query("ROLLBACK");
    return FALSE;
  }

  // All succeeded
  mysql_query("COMMIT");
  return TRUE;
}    
...