<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/book.pdo.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'tr',
  ),
  'this' => 
  array (
    0 => 'pdo.transactions.php',
    1 => 'Hareketler ve Ototeslim',
    2 => 'Hareketler ve Ototeslim',
  ),
  'up' => 
  array (
    0 => 'book.pdo.php',
    1 => 'PDO',
  ),
  'prev' => 
  array (
    0 => 'pdo.connections.php',
    1 => 'Bağlantılar ve Bağlantı Y&ouml;netimi',
  ),
  'next' => 
  array (
    0 => 'pdo.prepared-statements.php',
    1 => 'Hazır deyimler ve Saklı Yordamlar',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'tr',
    'path' => 'reference/pdo/transactions.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="pdo.transactions" class="chapter">
 <h1 class="title">Hareketler ve Ototeslim</h1>

 <p class="para">
  Bir veritabanına PDO üzerinden bağlantı kuracaksanız, sorgulara başlamadan
  PDO&#039;nun toplu hareketleri nasıl yönettiğini bilmek zorundasınız. Daha önce
  toplu hareketler (transactions) ile çalışmadıysanız
  şu dört ana özelliği bilmenizde yarar var: Dayanıklılık, Atomsallık, Yalıtım
  ve Tutarlılık (DAYT). Layman kuralları gereğince, bir toplu hareket olarak
  yürütülen bir işleme başlanıldığı takdirde, aşamalar halinde bile yürütülse,
  diğer bağlantılarla etkileşime girmeksizin veritabanına güvenle uygulanacağı
  garanti edilir. Ayrıca, toplu hareketler, istediğiniz taktirde (sanki işleme
  hiç başlamamışsınız gibi) otomatik olarak geri alınır ve betiğinizin
  hatalarla daha kolay başa çıkmasını sağlar.
 </p>
 <p class="para">
  Toplu hareketler genellikle bir defada uygulanacak işlemlerin bir betik (bir
  SQL deyimleri betiği) haline getirilmesiyle oluşur. Bunun
  bu güncellemelerin verimliliğini esaslı bir şekilde arttırmak gibi bir yan
  etkisi de vardır. Başka bir deyişle, toplu hareketler betiğinizin daha hızlı
  ve daha tutarlı çalışmasını sağlar (ancak, bunu sağlamak için toplu
  hareketleri doğru yerde kullanmanız gerekir).
 </p>
 <p class="para">
  Talihsizliğe bakın ki, her veritabanı toplu hareketleri desteklemez, bu
  yüzden PDO, önce bağlantı açılmasını gerektiren ve ototeslim kipi
  denen kipte çalışmak zorunda kalır. Ototeslim kipinde,
  çalıştırdığınız her sorgu veritabanı hareketleri destekliyorsa dolaylı
  olarak bir harekettir, desteklemiyorsa değildir. İhtiyacınız toplu
  hareketleri kullanmaksa hareketleri ilklendirmek için
  <span class="methodname"><a href="pdo.begintransaction.php" class="methodname">PDO::beginTransaction()</a></span> yöntemini kullanmalısınız. Eğer
  kullanmaya çalıştığınız veritabanı toplu hareketleri desteklemiyorsa bir
  <span class="classname"><a href="class.pdoexception.php" class="classname">PDOException</a></span> istisnası yavrulanır (hata işleme
  ayarlarınızdan bağımsız olarak: bu daima bir dizi hata durumundan oluşur).
  Bir toplu hareketi ilklendirdikten sonra hareketi başlatmak için
  <span class="methodname"><a href="pdo.commit.php" class="methodname">PDO::commit()</a></span>, hareketler yerine getirilirken
  çalıştırdığınız kodun başarı durumuna bağlı olarak hareketleri geri almak
  için <span class="methodname"><a href="pdo.rollback.php" class="methodname">PDO::rollBack()</a></span> yöntemini kullanabilirsiniz.
 </p>
 <div class="warning"><strong class="warning">Uyarı</strong>
  <p class="para">
   PDO, yalnızca sürücü düzeyinde işlem yeteneklerini denetler. Belirli çalışma
   zamanı koşulları hareketlerin kullanılamaz olduğu anlamına geliyorsa, fakat
   veritabanı sunucusu bir hareket başlatmak üzere isteği kabul ederse
   <span class="methodname"><a href="pdo.begintransaction.php" class="methodname">PDO::beginTransaction()</a></span> yine de hata vermeksizin
   <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong> döndürecektir.
  </p>
  <p class="para">
   Buna bir örnek, bir MySQL veritabanında MyISAM tabloları üzerinde hareketleri
   kullanmaya çalışmak olurdu.
  </p>
 </div>
 <p class="para">
  Bir toplu hareket veritabanına gönderilmişken bir nedenle betiğiniz
  sonlanırsa veya bağlantı kapatılmaya çalışılırsa PDO otomatik olarak
  hareketleri geri alır. Bu, betiğin beklenmedik durumlarda sonlanmasına karşı
  veritabanındaki verilerin tutarsız hale gelmesini önleyecek bir güvenlik
  önlemidir. Ancak toplu hareketleri doğrudan siz başlatmadıysanız bir şeyler
  zaten yolunda gitmemiş demektir, dolayısıyla verilerinizin güvenliği için
  hareketlere başa sarma işlemi uygulanır.
 </p>
 <div class="warning"><strong class="warning">Uyarı</strong>
  <p class="para">
   Otomatik başa sarma işlemi sadece toplu hareketler
   <span class="methodname"><a href="pdo.begintransaction.php" class="methodname">PDO::beginTransaction()</a></span> üzerinden ilklendirildiğinde
   uygulanır. Bir toplu hareket PDO&#039;sunu başlatan bir sorguyu el yordamıyla
   kendiniz başlatırsanız, neler olacağı bilinemez ve yanlış giden bir şeyler
   olursa bunlar geri alınamaz.
  </p>
 </div>
 <p class="para">
  <div class="example" id="example-1"><p><strong>Örnek 1 - Bir toplu hareket betiğinin çalıştırılması</strong></p>
   <div class="example-contents"><p>
    Aşağıdaki örnekte, yeni bir çalışan için 23 numaralı bir girdi kümesi
    oluşturduğumuzu varsayıyoruz. Şahıs için girilen temel bilgilere ilaveten
    ücretini de kaydedeceğiz. Bu basit işlemi iki ayrı güncelleme ile yapmak
    mümkünse de bu iki deyimi <span class="methodname"><a href="pdo.begintransaction.php" class="methodname">PDO::beginTransaction()</a></span> ve
    <span class="methodname"><a href="pdo.commit.php" class="methodname">PDO::commit()</a></span> çağrılarının arasına alıp bir sebeple
    işlem tamamlanamazsa yapılanların geri alınmasını garantilemiş olacağız.
    Eğer bir şeyler yolunda gitmezse <code class="literal">catch</code> kümesi haraket
    başladığından beri yapılan işlemleri geri alır ve bir hata iletisi basar.
   </p></div>
   <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #007700">try {<br />  </span><span style="color: #0000BB">$dbh </span><span style="color: #007700">= new </span><span style="color: #0000BB">PDO</span><span style="color: #007700">(</span><span style="color: #DD0000">'odbc:SAMPLE'</span><span style="color: #007700">, </span><span style="color: #DD0000">'db2inst1'</span><span style="color: #007700">, </span><span style="color: #DD0000">'ibmdb2'</span><span style="color: #007700">,<br />      array(</span><span style="color: #0000BB">PDO</span><span style="color: #007700">::</span><span style="color: #0000BB">ATTR_PERSISTENT </span><span style="color: #007700">=&gt; </span><span style="color: #0000BB">true</span><span style="color: #007700">));<br />  echo </span><span style="color: #DD0000">"Bağlantı kuruldu\n"</span><span style="color: #007700">;<br />} catch (</span><span style="color: #0000BB">Exception $e</span><span style="color: #007700">) {<br />  die(</span><span style="color: #DD0000">"Bağlanılamadı: " </span><span style="color: #007700">. </span><span style="color: #0000BB">$e</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getMessage</span><span style="color: #007700">());<br />}<br /><br />try {<br />  </span><span style="color: #0000BB">$dbh</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">setAttribute</span><span style="color: #007700">(</span><span style="color: #0000BB">PDO</span><span style="color: #007700">::</span><span style="color: #0000BB">ATTR_ERRMODE</span><span style="color: #007700">, </span><span style="color: #0000BB">PDO</span><span style="color: #007700">::</span><span style="color: #0000BB">ERRMODE_EXCEPTION</span><span style="color: #007700">);<br /><br />  </span><span style="color: #0000BB">$dbh</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">beginTransaction</span><span style="color: #007700">();<br />  </span><span style="color: #0000BB">$dbh</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">exec</span><span style="color: #007700">(</span><span style="color: #DD0000">"insert into staff (id, first, last) values (23, 'Joe', 'Bloggs')"</span><span style="color: #007700">);<br />  </span><span style="color: #0000BB">$dbh</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">exec</span><span style="color: #007700">(</span><span style="color: #DD0000">"insert into salarychange (id, amount, changedate)<br />      values (23, 50000, NOW())"</span><span style="color: #007700">);<br />  </span><span style="color: #0000BB">$dbh</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">commit</span><span style="color: #007700">();<br /><br />} catch (</span><span style="color: #0000BB">Exception $e</span><span style="color: #007700">) {<br />  </span><span style="color: #0000BB">$dbh</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">rollBack</span><span style="color: #007700">();<br />  echo </span><span style="color: #DD0000">"İşlem başarısız oldu: " </span><span style="color: #007700">. </span><span style="color: #0000BB">$e</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">getMessage</span><span style="color: #007700">();<br />}<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
   </div>

  </div>
 </p>
 <p class="para">
  Güncellemeleri birer toplu hareket olarak yapmak zorunda değilsiniz. Almak
  istediğiniz veriler için karmaşık sorgular yapabileceğiniz gibi elde
  ettiğiniz verilerle başka sorgular ve güncellemeler yapmanızda da mümkündür.
  Ancak, bu arada bir toplu hareket işlemi yürütülüyorsa, bu çalışmanın
  ortasında kimsenin hiçbir veriyi değiştiremeyeceği garanti altındadır. Toplu
  hareketlerle ilgili daha ayrıntılı bilgi için veritabanı sunucunuzun
  belgelerine bakınız.
 </p>
</div>
<?php manual_footer($setup); ?>