Işlem davranışı İki hızlı soru

2 Cevap php

Şöyle bir kod var:

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(); }      
}

Benim sorular şunlardır:

  1. Ben bu iyi bir iç içe geçmiş işlem olabilir, bir işlem Yürürlükten duyuyorum. Iç içe bir işlem durumunda, bir istisna atılır ve ben geri alma go (dıştaki işlem için) geri yapar ne kadar, geri alma ise - sağduyu bu durumda olması gerektiğini önermek, ama kimse anlamaz.

  2. Ben (Zend GC tarafından 'freeable' olarak işaretleme, ok) bellek boşaltarak duyuyorum. Ben döngü SONRA işlem uygulanıyor olduğum için, (değişken döngü IN frreable olarak işaretlenmiş), bu güvenli - Ben değeri geldiğini unset değişken olsa bile verileri güvenle db saklanır demek?

2 Cevap

Soru 2 cevap:

  • sorgu veritabanına gönderilen edildikten sonra, ne PHP değişkenler üzerinde yapılır artık farketmez
  • Bunun bir etkisi olacak yapacağım tek şey zaman olacak commit veya rollback.
  • hangi PHP değişkeni unsetting DB tarafında işlemleri / veriler üzerinde hiçbir etkiye sahip olacağı anlamına gelir.


About question 1 :

Dışarıdan görünür olarak dıştaki işlemin sadece sonuçlarına yana, iç içe işlemleri gibi biraz mantıklı olması ve büyük sistemlerin sadece SQL Server onları destekler.

SQL Server, bir ara geri alma, ara işlem başlangıcına geri alır bir ara taahhüt hiçbir şey yapmaz.

Dıştaki geri alma dıştaki bütün dıştaki işlem taahhüt işlemek, (arasında commits vardı bile) tüm dış işlemi geri alır.

Diğer sistemler arasındaki olası SAVEPOINTS ile tek bir işlem düzeyine sahiptir. Sen (kendi adını vererek) önceki Savepoint her geri alma, ancak savename noktası olmadan bir COMMIT veya ROLLBACK veren her taahhüt veya dıştaki işlemi geri alır edebilirsiniz.