NASIL YAPILIR? Veritabanı işlemlerin'de begintransaction

arcface

Âyinesi iştir kişinin lafa bakılmaz
Kayıtlı Kullanıcı
Katılım
25 Eyl 2020
Mesajlar
216
Tepkime puanı
162
Puanları
48
Konum
istanbul
Web sitesi
www.arcface.net
Merhabalar,

Benim için hayat kurtaran bir işlev bazen aynı anda 20 farklı alanda ve 3-4 farklı veritabanı üzerinde değişiklikler yapıyorum ve bu işlev olmasaydı bin satırlık kod 30-40 binlere çıkmak zorunda kalırdı.

begintransaction Nedir?

Veritabanı üzerinde yaptığınız işlemleri begintransaction ile en başta başlattığınız da bu işlemler toplanır ve siz yaptığınız işlemleri commit etmediğiniz sürece de veritabanı üzerinde bu işlemler gerçekleşmez. Bir işlev yaptınız ve hata kodu döndü rollback ile işlemi geri alabilirsiniz.

Örnek bir kullanım göstereyim şuan kodlamasını yaptığım bir proje üzerinden anlatım yapayım rahat şekilde kavrayacaksınız.


PHP:
<?php

$db->begintransaction();

$control = $db->from('mail_accounts')->where('id',post('id'))->first();

if($control){

    $mail_varmi = $db->from('mailbox')->select('id,attachments')->where('account_id',post('id'))->run();

    if($mail_varmi){

        $mail_delete = $db->delete('mailbox')->where('account_id',post('id'))->done();

    }else{

        $mail_delete = true;

    }



    $delete = $db->delete('mail_accounts')->where('id',post('id'))->done();



    if($mail_delete && $delete){

        app::log_add('Posta Hesabı ve iletileri silindi. Posta Hesabı: '.$control['username']);

        $db->commit();

        $jsondata = [

            'tamam' => true,

            'heading' => 'Posta Hesabı Silindi!',

            'text' => 'Posta hesabı ve iletileri tamamen silinmiştir.',

            'type' => 'success',

            'token' => session('token'),

        ];

    }else{

        $db->rollBack();

        $jsondata = [

            'heading' => 'Bir Hata Oluştu!',

            'text' => 'Posta hesabı silinirken bir hata oluştu. Lütfen sayfayı yenileyerek tekrar deneyiniz.',

            'token' => session('token'),

        ];

    }



}else{

    $jsondata = [

        'heading' => 'Bir Hata Oluştu!',

        'text' => 'Silmeye çalıştığın hesap bulunamadı, varolmayan bir hesabı silmeye çalışıyor olabilirsin.',

        'token' => session('token'),

    ];

}

?>

Öncelikle işlemlerimin en başına gelip bir transaction işlemi başlatıyorum o andan itibaren yazılan her işlev ben commit edene kadar geçerli kılınmayacaktır.

Ek olarak ben pdo kullandığım için ve mysqli'de de aynı durum geçerli pdo classs'ı içinde bir fonksiyon bulunduğu için direkt begintransaction yazarak kullanabiliyorum ama farklı direkt sql olarak da şu şekil'de kullanabilirsiniz.

PHP:
<?php

$db->query('BEGIN TRANSACTION');

$mail_sil_sorgu = $db->prepare('DELETE FROM mailbox  WHERE accound_id = :id');
$mail_cikti = $mail_sil_sorgu->execute([
   'id' => 1
]);

$mail_hesap_sil = $db->prepare('DELETE FROM mail_accounts WHERE id = :id');
$hesap_cikti = $mail_hesap_sil->execute([
   'id' => 1
]);

if ($mail_cikti && $hesap_cikti){
   $db->query('COMMIT'); // işlemi tamamla
} else {
   $db->query('ROLLBACK'); // işlemi iptal et
}

Burada yaptığım işlem bir mail hesabını veritabanı üzerinden silme ama bir kaç tablo üzerinde işlem bulunduğu için herhangi bir alan da veritabanı sorunu oluşur ise sistem sapıtacağından hayat kurtaran bir işlevdir transaction işlevi böyle bir şey yakalarsam direkt rollback yaparak komutları iptal ediyorum.

Önce mail hesabına ait mailleri siliyorum sonra da mail hesabını kaldırıyorum eğer transaction kullanmasaydım mailbox'daki iletiler silinip hesap silinmezse hesabın posta kutusu açılamadığı için hata verecekti veya tam tersi mailler silinmeyip hesap silinseydi o zaman da hangi hesaba ait olduğu bilinmeyen binlerce posta spam gibi veritabanında yer alacaktı. Kullanım alanı çok fazla ama ben özellikle ödeme sistemlerinde kullanıyorum çünkü o alanda çok fazla veritabanı işlemi gerçekleştiriyorum.

Anlamadığınız bir kısım olur ise konu altında sorabilirsiniz.
 
5,684Konular
16,875Mesajlar
9,752Kullanıcılar
tolgasazakSon üye
Üst