PHP beginTransaction nedir ?

"</p

Begin Transaction

Begin Transaction toplu işlemlerin çalışması esnasında oluşan hata durumunda son yapılan değişikliklerin geri alınması için kullanılmaktadır .  php ile bizlere kolaylık ve işlem güvenliğini sağlamak için bu fonksiyon veritabanı işlemlerini başlatmadan önce bir işlemi başlatır ve tüm işlemler başarıyla tamamlanana kadar bunu sürdürür. Bu işlev, ayrıntılı bir şekilde kullanıldığında, veritabanı işlemlerinin güvenliğini ve tutarlılığını sağlamak için son derece yararlı olacak .

Fonksiyonun çağrısı ile “begin transaction”, veritabanı işlemi için bir işlem başlatır. İşlem bu sayede tüm veritabanı sorgularını işlemeye başlamadan önce yapılmak zorundadır. Bu işlem başlatıldıktan sonra, “commit” veya “rollback” işlemleri ile sonlandırılana kadar devam edecektir.

İşlemin başlatılması için kullanılan “begin transaction fonksiyonu”, sorguları yürütmek için bir veritabanı bağlantısını açar ve bu bağlantıyı işlem boyunca kullanır. İşlem başarıyla tamamlandıktan sonra, bağlantı kapatılır ve diğer sorgular için kullanılabilir hale gelir.

“Begin transaction” işlevinin bir diğer önemli yönü, veritabanı işlemlerinin tutarlılığını sağlamaktır. İşlem başladığında, veritabanındaki tüm sorguları işlemeden önce tüm değişiklikler kaydedilir. Bu, herhangi bir hata veya kesinti durumunda verilerin bozulmasını önler. İşlem başarısız olursa, tüm değişiklikler geri alınır ve veritabanı eski haline döndürülür.

“Begin transaction” işlevi, bir dizi sorgunun tek bir işlem olarak işlenmesini sağlar. Bu, birden fazla sorgunun birbirine bağımlı olduğu durumlarda son derece yararlıdır. Örneğin, bir siparişin işlenmesi sırasında stok seviyelerinin güncellenmesi gerekebilir. Bu işlemler arasındaki bağımlılıkların yönetimi, “begin transaction” işlevi kullanılarak kolayca yapılabilir.

Sonuç olarak, “begin transaction” işlevi, PHP’de veritabanı işlemlerinin güvenliğini ve tutarlılığını sağlamak için son derece yararlı bir araçtır. İşlemleri tek bir işlem olarak ele almak, bağımlılıkları yönetmek ve hataların etkilerini en aza indirmek için kullanılabilir. Bu işlev, veritabanı işlemleri için kritik bir araçtır ve her PHP geliştiricisinin bilmesi gereken önemli bir konudur. Ayrıca, “begin transaction” işlevi, veritabanı işlemlerinin performansını da artırabilir, çünkü bir dizi sorguyu tek bir işlem olarak işlemek, işlem başına bağlantı açma ve kapatma maliyetlerini azaltabilir.

Bununla birlikte, “begin transaction” işlevinin doğru kullanımı son derece önemlidir. İşlem başladıktan sonra, “commit” veya “rollback” işlemleriyle sonlandırılması gerekir. “Commit” işlemi, veritabanındaki tüm değişiklikleri kaydeder ve işlemi tamamlar. “Rollback” işlemi ise, tüm değişiklikleri geri alır ve işlemi iptal eder. Bu işlemlerin doğru kullanımı, veritabanı işlemlerinin tutarlılığını sağlamak için kritik bir önem taşımaktadır.

Ayrıca bir başka örnek daha verecek olursak , “begin transaction” işlevi, birden fazla kullanıcı veya işlem arasındaki veri bütünlüğü sorunlarını da önleyebilir. Örneğin, iki kullanıcının aynı anda bir kaydı güncellemesi durumunda, veritabanı işlemi doğru şekilde yapılmazsa veri bütünlüğü sorunları ortaya çıkabilir. “Begin transaction” işlevi, bu tür sorunları önlemek için kullanılabilir.

Sonuç olarak, “begin transaction” işlevi, PHP’deki veritabanı işlemlerinin tutarlılığını ve güvenliğini sağlamak için son derece önemlidir. İşlemleri tek bir işlem olarak ele almak, bağımlılıkları yönetmek ve hataların etkilerini en aza indirmek için kullanılabilir. Ancak, doğru kullanımı son derece önemlidir ve “commit” veya “rollback” işlemleriyle sonlandırılmalıdır.

Şimdi bunları daha detaylı begin transaction kod örnekleri ile anlamaya çalışalım .

Örnek 1:

Daha önceki dersler de begin transaction için farklı bir örnek vermiştik. Şimdi farklı bir örnek ile daha da pekiştirelim . Diyelim ki bir form sayfası oluşturdunuz . Oluşturduğunuz bu form sayfası kullanıcıdan aldığınız verileri veritabanın da 3 farklı tabloya yazdığınızı düşünün . Buraya kadar her şey çok güzel ancak veriler yazılırken tablolardan birindeki kayıt işlemi esnasında hata oluşursa işte bundan sonra işimiz biraz sıkıntıya girer . Çünkü kullanıcının yapmış olduğu diğer 2 tablodaki verilerin hata sonucunda silinmesi gerekecektir. Tek tek bu satırları veri tabanı sorguları ile eski haline getirmek ve işlem yükünü arttırmak yerine begin transaction kullanarak tüm yükten kurtulabiliriz.

Aşağıdaki örneği inceleyerek aslında ne demek istediğimi daha net anlayabilirsiniz .

<?php
/* Oto Commit kipi bu satırda beginTransaction komutuyla birlikte kapatılır ve işlemler için toplu bir hareket başlar. */
$transaction->beginTransaction();

/* Basit bir veritabanı işlemi yapalım ve şemayı ve verileri değiştirelim. */
$sth = $transaction->exec("DROP TABLE meyveler");
$sth = $transaction->exec("UPDATE içecekler SET name = 'muz'");

/* Yukarıdaki güncellemeyi farkediyoruz ve hareketleri geri alıyoruz. */
$transaction->rollBack();

/* rollBack çalıştıktan sonra veritabanı bağlantısı tekrardan oto commit kipine göri dönecektir. */
?>

Örnek 2: Yeni bir kullanıcı kaydetmek

Aşağıdaki örnekte, “users” tablosuna yeni bir kullanıcı kaydetmek için “begin transaction” işlevini kullanıyoruz. İşlem başarılı bir şekilde tamamlandığında, “commit” işlemiyle tüm değişiklikleri kaydediyoruz. Ancak bir hata oluştuğunda, “rollback” işlemiyle tüm değişiklikleri geri alıyoruz.

<?php
try {
  $conn = new PDO("mysql:host=localhost;dbname=myDB", "username", "password");
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  $conn->beginTransaction();

  $sql = "INSERT INTO users (name, email) VALUES ('John Doe', 'john.doe@example.com')";
  $conn->exec($sql);

  $conn->commit();
  echo "New user added successfully";
} catch(PDOException $e) {
  $conn->rollback();
  echo "Error: " . $e->getMessage();
}
$conn = null;
?>

Örnek 3: Bir kullanıcının bilgilerini güncelleme

Aşağıdaki örnekte, “users” tablosundaki bir kullanıcının bilgilerini güncelliyoruz. İşlem başarılı bir şekilde tamamlandığında, “commit” işlemiyle tüm değişiklikleri kaydediyoruz. Ancak bir hata oluştuğunda, “rollback” işlemiyle tüm değişiklikleri geri alıyoruz.

<?php
try {
  $conn = new PDO("mysql:host=localhost;dbname=myDB", "username", "password");
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  $conn->beginTransaction();

  $sql = "UPDATE users SET email='jane.doe@example.com' WHERE id=1";
  $conn->exec($sql);

  $conn->commit();
  echo "User information updated successfully";
} catch(PDOException $e) {
  $conn->rollback();
  echo "Error: " . $e->getMessage();
}
$conn = null;
?>

Örnek 3: Birden fazla sorguyu işleme alma

Aşağıdaki örnekte, “begin transaction” işlevini birden fazla sorguyu işlemek için kullanıyoruz. İşlem başarılı bir şekilde tamamlandığında, “commit” işlemiyle tüm değişiklikleri kaydediyoruz. Ancak bir hata oluştuğunda, “rollback” işlemiyle tüm değişiklikleri geri alıyoruz.

<?php
try {
  // Veritabanına bağlanmak için PDO nesnesini oluşturuyoruz
  $conn = new PDO("mysql:host=localhost;dbname=myDB", "username", "password");

  // PDO nesnesinin hata modunu ayarlıyoruz
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  // Yeni bir işlem başlatıyoruz
  $conn->beginTransaction();

  // İlk sorguyu hazırlıyoruz
  $sql1 = "INSERT INTO users (name, email) VALUES (:name, :email)";
  $stmt1 = $conn->prepare($sql1);

  // Parametreleri bağlıyoruz
  $stmt1->bindParam(':name', $name);
  $stmt1->bindParam(':email', $email);

  // Parametreleri atıyoruz
  $name = "John Doe";
  $email = "john.doe@example.com";

  // Sorguyu çalıştırıyoruz
  $stmt1->execute();

  // Kullanıcının ID'sini alıyoruz
  $user_id = $conn->lastInsertId();

  // İkinci sorguyu hazırlıyoruz
  $sql2 = "INSERT INTO orders (user_id, product_name, quantity) VALUES (:user_id, :product_name, :quantity)";
  $stmt2 = $conn->prepare($sql2);

  // Parametreleri bağlıyoruz
  $stmt2->bindParam(':user_id', $user_id);
  $stmt2->bindParam(':product_name', $product_name);
  $stmt2->bindParam(':quantity', $quantity);

  // Parametreleri atıyoruz
  $product_name = "Example Product";
  $quantity = 1;

  // Sorguyu çalıştırıyoruz
  $stmt2->execute();

  // İşlemi tamamlıyoruz
  $conn->commit();
  
  echo "New user and order added successfully";
} catch(PDOException $e) {
  // Hata oluştuğunda işlemi geri alıyoruz
  $conn->rollback();
  echo "Error: " . $e->getMessage();
}

// Veritabanı bağlantısını kapatıyoruz
$conn = null;
?>

Bu örnekte, ilk olarak PDO nesnesi ile veritabanına bağlanıyoruz. Daha sonra “beginTransaction” işlevini kullanarak yeni bir işlem başlatıyoruz. İlk sorguda yeni bir kullanıcı kaydediyoruz ve daha sonra “lastInsertId” işlevini kullanarak kullanıcının ID’sini alıyoruz. Ardından, ikinci sorguda bu kullanıcının bir siparişini kaydediyoruz. İşlem başarılı bir şekilde tamamlandığında, “commit” işlemiyle tüm değişiklikleri kaydediyoruz. Ancak bir hata oluştuğunda, “rollback” işlemiyle tüm değişiklikleri geri alıyoruz.

 

PDO::beginTransaction 

Begin transaction auto commit modunu kapatır. Bu mod kapandığı zaman PDO veritabanın da yapılan son değişiklik PDO::Commit() ile kalıcı hale getirilmeden veritabanında herhangi bir değişiklik yapmaz.

(PHP 5 >= 5.1.0, PHP 7, PHP 8, PECL pdo >= 0.1.0) sürümlerinden itibaren kullanılabilmektedir. PDO::beginTransaction — Toplu bir işlemi önceliklendirir ve geri alınması için olanak sağlar. Konuyu daha iyi anlamak için php’nin resmi web sitesinde de örnekleri inceleyebilirsiniz.  Ayrıca php derslerimiz de ;

Konularını da inceleyin !

Yorum Ekle