Два быстрых вопроса о поведении транзакции - PullRequest
2 голосов
/ 27 февраля 2010

У меня есть код, который выглядит так:

function foobar(array& $objects, $con = null)
{
   if (is_null($con))
      $con = DbSingleton::getConnectio();

   $con->beginTransaction();  // <- question 1

   try
   {
     foreach($objects as $object)
     {
        // allocate memory for new object 
        $new_obj = new MyShiningNewObject();

        // do something to the new object ...
        $new_obj->setParentId($object->getId());
        $new_obj->save($con);

        // mark for garbage collection
        unset($new_obj);  // <- question 2
      }

     $con->commit();
  }
  catch(Exception $e){ $con->rollBack(); }      
}

Мои вопросы:

  1. Я начинаю транзакцию, это вполне может быть вложенная транзакция. В случае вложенной транзакции, если выброшено исключение, и я выполняю откат, то, как далеко идет откат (до самой внешней транзакции) - здравый смысл подсказывает, что так и должно быть, но никто не знает.

  2. Я освобождаю память (хорошо, пометил как «свободный» Zend GC). Поскольку я фиксирую транзакцию ПОСЛЕ цикла (переменная помечается как frreable В цикле), это безопасно - я имею в виду, будут ли данные безопасно храниться в БД, даже если я сбросил переменную, из которой получено значение?

Ответы [ 2 ]

2 голосов
/ 27 февраля 2010

Поскольку только результаты самой внешней транзакции, видимой извне, вложенные транзакции как таковые не имеют смысла, и только в основных системах их поддерживает только SQL Server.

В SQL Server промежуточный откат возвращается к началу промежуточной транзакции, промежуточный коммит ничего не делает.

Внешний откат выполняет откат всей внешней транзакции (даже если между ними были зафиксированы коммиты), самый внешний коммит фиксирует всю внешнюю транзакцию.

В других системах есть только один уровень транзакций с возможным SAVEPOINTS между ними. Вы можете выполнить откат к каждой из предыдущих точек сохранения (указав их имя), но при выдаче COMMIT или ROLLBACK без точки сохранения всегда выполняется фиксация или откат самой внешней транзакции.

1 голос
/ 27 февраля 2010

Чтобы ответить на вопрос 2:

  • после отправки запроса в базу данных, что делается с переменными PHP, больше не имеет значения
  • единственное, что вы сделаете, будет иметь влияние, когда вы будете commit или rollback.
  • , что означает, что сброс переменной PHP не повлияет на транзакции / данные на стороне БД.


По вопросу 1:

...