MySQL’de sorgularımızı yazarken gün olur, aynı anda iki sorgunun çalışması gerekebilir, iki sorgunun da doğru sonuç döndürmesi gerekmektedir uygulamamız açısından. Örnek olarak iki banka hesabı arasındaki para transferlerini gösterebiliriz, birinci kişinin hesabından para silindikten sonra ikinci kişinin hesabına para yatmamışsa, pek de hoş durumlarla karşılaşmazsınız.

transaction-resim.jpg

Her iki sorgunun da güvenle gerçekleştiğinden emin olabilmek için “Transaction” cümleleri kullanırız. Bu yazımızda da bu cümleleri nasıl oluşturacağımızı ve PHP uygulamalarında nasıl kullanacağımızı tartışalım.

Tablomuz

Örnek olarak iki tane tablo kullanalım, biri Akbank’a ait olsun, diğeri Garanti’ye!

akbank:

hesap_no isim mevcut_para
………. ……….. …………..
625021 ali 500 000
………. ………… ………….

garanti:

hesap_no isim mevcut_para
………. ……….. …………..
124500 ayşe 1000
………. ………… ………….

Görüldüğü üzere Ali’nin hesabında 500 000 ytl bulunmakta ve Ayşe’nin ise 1000 ytl’si var. Ali Ayşe’ye 10 000 ytl göndermek isterse yapacağımız işin mantığı şöyle olacak: Ali’nin hesabındaki parayı 500 000 – 10 000 yaparken, Ayşe’nin ki 1000 + 10 000 olacak. İki adet “update” sorgusu. Ama ikisinin de gerçekleşmesi gerekiyor, biri gerçekleşmezse diğeri de gerçekleşmeyecek.

Transaction sql cümlesi

Transaction cümlesini yazarken 3 temel kelime vardır:

  • START TRANSACTION: İşlemi başlatan cümledir.
  • ROLLBACK: Sorgulardan biri gerçekleşmezse işlemi sağlıklı biçimde geri alır, her tablo işlemden önceki haline geri döner.
  • COMMIT: İşlemi gerçekleştirir.

Yukarıdaki işlemi gerçekleştirecek Transaction cümlesini şöyle ifade edebiliriz:

START TRANSACTION
UPDATE akbank SET mevcut_para = mevcut_para – 10000 WHERE hesap_no = '625021'
UPDATE garanti SET mevcut_para = mevcut_para + 10000 WHERE hesap_no = '124500'
ROLLBACK

Bu kod parçası istediğimiz işlemi gerçekleştiriyor ancak COMMIT komutunu vermediğimiz için işlem gerçekleşmeyecektir.

PHP ile kullanımı

Transaction’ın asıl önemi belki de PHP uygulamamızda kullanırken açığı çıkıyor, yapmak istediğimiz işlemi PHP kodları ile şu şekilde ifade edebiliriz:

mysql_connect("localhost", "kullanici", "parola");
mysql_select_db("veritabani");
 
//transaction basliyor
mysql_query("BEGIN");
 
//sorgular hazirlaniyor
$sorgu1 = mysql_query("UPDATE akbank SET mevcut_para = mevcut_para – 10000 WHERE hesap_no = '625021'");
$sorgu2 = mysql_query("UPDATE garanti SET mevcut_para = mevcut_para + 10000 WHERE hesap_no = '124500'");
 
if (!$sorgu1 or !$sorgu2 )
{
	//hata var, geri aliyoruz
	mysql_query("ROLLBACK");
}
else
{
	//hata yok, islem tamamlaniyor
	mysql_query("COMMIT");
}
</code>

PHP içerisinde kullanımı da bu şekilde gerçekleşiyor.

Tablo motoru seçimi

MySQL tablo motorları konusunda daha önce yazı yazmıştık, tekrar okumak için buraya tıklayabilirsiniz, orada TST ve NTST’den bahsetmiştik. Transaction kullanabilmek için MySQL motorunun bunu desteklemesi gerekmektedir. Bu nedenle InnoDB veya benzeri bir TST tablo motoru kullanmamız gerekmektedir.

Sonuç

İki sorgunun da (veya daha fazla) gerçekleşmesi gerekiyorsa Transactionlar hayat kurtarıcı olabilir. Bu gibi durumlarda gönül rahatlığıyla kullanılabilirler!

Bir sonraki MySQL yazısında görüşmek üzere!

MySQL’de Transaction ve PHP ile kullanımı
Tagged on:         

16 thoughts on “MySQL’de Transaction ve PHP ile kullanımı

  • 25 Mayıs 2008 at 19:38
    Permalink

    Teşekürrler, yine güzel bir yazı…

    Ne kadar zamanınızı alıyor böyle yazılar? Bu blogu takip ediyorum ve yazılarınızın hepsinde aynı özeni görebiliyorum.

    Emeğinize sağlık :)

  • 26 Mayıs 2008 at 06:40
    Permalink

    İlginiz için teşekkürler.

    Yazılar genelde 2-2,5 saatimi alıyor, ama 4-5 saatimi alan yazılar da oluyor. Bu nedenle blogu sık güncellemek bazen sorun olabiliyor çünkü dediğiniz gibi her yazıya özen göstermeye çalışıyorum.

    Aslında blogla ilgili daha yapmak istediklerim çok farklı şeyler var ancak fazla vakit bulamıyorum.

    Siz yine blogu takip edin, zamanla yeni şeyleri de farkedeceksinizdir 😉

  • 26 Mayıs 2008 at 13:48
    Permalink

    Tebrikler, güzel bir yazı olmuş ve önemli bir konuya değinmişsiniz.

  • 26 Mayıs 2008 at 17:15
    Permalink

    Teşekkürler, sizin beğenmenize sevindim :)

  • 27 Mayıs 2008 at 07:27
    Permalink

    Çok güzel bir anlatım, biraz teorik bilgim olmakla beraber toplam 15-20 saniyede (ara metinleri atlayarak) okuyabildim. Elinize sağlık.

  • 27 Mayıs 2008 at 14:58
    Permalink

    Harika bir özellik, tek kötü yanı MyIsam’da çalışmaması sanırım.

    Bu güzel yazı için teşekkürler.

  • 28 Mayıs 2008 at 07:58
    Permalink

    güzel ve faydalı bir yazı olmuş tebrikler

  • 29 Mayıs 2008 at 06:57
    Permalink

    Teşekkürler.

  • 06 Haziran 2008 at 20:22
    Permalink

    Teşekkürler çok güzel bir yazı olmuş. Blogunuzu yeni farkettim ve adeta ağzım açık kaldı. Böyle profesyonel bloglar çok az gerçekten.
    Benim sormak istediğim birşey var kullandığınız resimleri nasıl böyle biraz yana çevrilmiş yapıyorsunuz?

  • 07 Haziran 2008 at 10:34
    Permalink

    Teşekkürler, elimden geldiğince güzel yazmaya çalışıyorum Okuyanlar da böyle güzel yorumlar yazınca insanın yazası geliyor :)

    Resimleri yana çevirmek içinse photoshop kullanıyorum.

  • 04 Eylül 2008 at 12:10
    Permalink

    Çok güzel bir yazı olmuş.

    Diliniz çok yalın, rahat anlaşılıyor.

  • 10 Eylül 2008 at 02:08
    Permalink

    örnek olarak, elimizde bir kişinin kampanya çeki var…

    kişimiz sitemizden alışveriş yapıyor…

    ödeme kısmında bizim iki işlemi birden yapmamız gerekiyor…

    a -> kişinin hediye kuponunu imha etmek
    b -> müşterinin ödemesini sisteme işlemek…

    normalde sallapati yaparız gider, lakin iş ticarete geldikçe pek o kadar kolay olmuyor…

    işte böylesi bir durumda kurtarıcı oluyor transaction

    henüz bu modülü yazacağım vakit gelmedi, lakin gelirse kullanacağım :)

  • 02 Kasım 2008 at 19:54
    Permalink

    merhaba,

    bu tür işlemlerin kullanıldığı sistemlerde yapılması gereken bir diğer işlem de kayıt kilitleme. Yani bir kullanıcı kaydı incelerken diğerleri kayıt üzerinde değişiklik yapamasın. Bu konu hakkında da birşeyler yazabilir misiniz?

  • 03 Kasım 2008 at 16:04
    Permalink

    Merhaba

    öneriniz ve ilginiz için çok teşekkürler. Ancak şu sıralar sağlık problemleri ile uğraşmaktayım, bloga da yeterince zaman ayıramıyorum bu yüzden. Zaten yazılan son yazının tarihi de bunu ortaya çıkarmakta…

    İyileşmek için bir süredir pek fazla birşey yapmıyorum. Ama iyileştiğim zaman bu konuda da güzel bir yazı yazmak isterim…

  • 09 Ocak 2009 at 11:21
    Permalink

    faydalı bilgiler vermeye devam.. :)

Comments are closed.