Mysql Commit & RollBack

Standard

Herkese selam,

Uzun bir aradan sonra tekrar sizlerleyim… Bugün sizlere büyük projelerde çalışıyorsanız hayati önem taşıyan bir konuya değineceğim.. Commit & RollBack kardeşler 🙂

Bu olaydan kabaca bahsetmek gerekirse bir örnek ile;

Diyelim ki E-Ticaret sitesinde kişi kredi kartı ile satın alma işlemi yapıyor ama yapmadan önce siz 2-3 tane başka iş yapıyorsunuz diyelim ve en son parayı çekiyorsunuz.. Ya para çekilemezse? İşlem başarısız ise? İşte bu durumlar için tam da RollBack ve Commit işinizi görecektir..

Commit işlemi, veritabanın da tablolar üzerinde yapılan insert, update, delete işlemlerinin tablolara kalıcı olarak yazılma işlemidir. Mysql kurulumunda AUTOCOMMIT özelliği default olarak 1 yani aktif olarak gelir. Bu yüzden pek fazla kişi böyle bir özelliğin farkında olmaz.
AUTOCOMMIT aktif olduğu için tablolar üzerindeki her hareketimiz otomatik olarak anında
commit edilmiş olur. Böylece yaptığımız işlemi geri alma şansımız olmaz. Yanlış yaptığımız bir update işlemi kalıcı olarak tablolara yazılmış olu yani yandı gülüm keten helva 🙂

Bu özelliği kullanabilmemiz için tablo yapımızın transaction table özelliği olan INNODB olması gerekmektedir.

İlk aşamada Mysql üzerindeki autocommit özelliğinin açık mı yoksa kapalı mı
olduğuna bakalım;

SELECT @@AUTOCOMMIT;

Sonuç 1 olarak dönerse açık ,0 olarak dönerse kapalı anlamındadır.

Daha sonra autocommit özelliğini kapatalım;

SET AUTOCOMMIT=0

Bu komut satırını da çalıştırdığımızda bu özelliği kapatmış oluruz.
Tekrardan SELECT @@AUTOCOMMIT; derseniz 0 döndüğünü görürsünüz.

Kısa bir örnek ile devam edelim isterseniz;

Begin;
UPDATE odemeler SET tutar = 1000 WHERE id=1;

Yukarıdaki sorguyu Çalıştırdığımızda id si 1 olan ödemeye 1000 atadık. Dikkat ederseniz update işleminden önce Begin anahtarını kullandım. Eğer sorgularımız da BEGIN anahtarını kullanmazsak
rollback yapamayız, yani 1 id li ödemeyi tekrar eski haline döndüremeyiz.

Şimdi ise update ‘imizi yaptık, yaptığımız update işleminin doğruluğundan eminsek;

COMMIT;

anahtarını yazıp çalıştırıyoruz. Böylece yaptığımız update işlemi kalıcı olarak tabloya yazılmış oluyor. Yok emin değilsek, yaptığımız update işlemi yanlış ise;

ROLLBACK;

yazıp çalıştırıyoruz. Böylece yaptığımız update işlemini geri almış oluyoruz.

Gördüğünüz gibi COMMIT/ROLLBACK işlemi hayati önem taşır ve kullanmanızı
tavsiye ederim.

Açıklayıcı olmuştur umarım, iyi çalışmalar dilerim

Print Friendly, PDF & Email
Facebooktwitterlinkedin

3 thoughts on “Mysql Commit & RollBack

  1. İBRAHİM YILDIZ

    CREATE TABLE urunler (
    urun_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    urun_adi VARCHAR(255) NOT NULL,
    urun_fiyat DECIMAL(10,0) NOT NULL,
    kat_id INT NOT NULL
    ) ENGINE=INNODB;

    START TRANSACTION; Veya BEGIN Yazıyorum
    Delete from urunler where id =1;
    COMMIT;

    Yapıyorum ve Her Hangi Bir Hata Almıyorum Ama
    START TRANSACTION; Veya BEGIN Yazıyorum
    Delete from urunler where id =1;
    ROLLBACK; Yapınca Yaptıgım Degislik Gitmiyor

    • Onur Canalp

      Öncelikle yazdığınız sorgunuz zaten çalışmaz; urun_id olarak tanımlamışsınız ancak delete işleminde `id` şeklinde kullanmışsınız…

      Aşağıdaki şekilde çalışması gerekiyor normal şartlarda:

      START TRANSACTION;
      Delete from urunler where urun_id =1;
      ROLLBACK;

      Ancak auto commit ediyor olabilir; aşağıdaki şekilde başına auto commit işlemini pasif ederek dener misiniz?

      SET autocommit=0;
      START TRANSACTION;
      Delete from urunler where urun_id =1;
      ROLLBACK;

  2. Sadık

    Merhaba change ile resimleri hem dosyaya hem db’e yazsak (ürün resimleri)
    formda diğer alanları doldurup submit edersek ürün bilgilerinde problem olursa bunu change ile yapılanları nasıl rollback yapacağız iki işlem ayrı sayfalarda ve
    chende ile yapılan kayıtlardan sonra kullanıcı kalkıp 1 saat sonra gelip formu doldurabilir.

    Diyelimki hiç hata yok peki change ile kaydettiğimiz resimlere ürün id sini daha eklenmemiş ürün id sini nasıl senkronize edebiliriz.

İBRAHİM YILDIZ için bir yanıt yazın Yanıtı iptal et

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir