MySQL’de Transaction ve PHP ile kullanımı

Date25 / Mayıs / 2008 Author İsa Engiz    Category mysql     Tags , , Yorumlar16 Yorum Yapilmis.

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!

- Bu blogda yer alan yazıları RSS ile takip edebilirsiniz. RSS aboneliği için tıklayın.

- Ya da bu blogda yer alan bütün yazıları içindekiler sayfasında görüntüleyebilirsiniz. Tıklayın!

MySQL’de Transaction ve PHP ile kullanımı yazısına 16 Yorum yapılmış.

  • faruk 25 Mayıs 2008, 19:38

    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 :)

  • İsa 26 Mayıs 2008, 06:40

    İ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 ;)

  • erhan 26 Mayıs 2008, 13:48

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

  • İsa 26 Mayıs 2008, 17:15

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

  • gri 27 Mayıs 2008, 07:27

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

  • Umut Muhaddisoğlu 27 Mayıs 2008, 14:58

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

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

  • Hüseyin 28 Mayıs 2008, 07:58

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

  • İsa 29 Mayıs 2008, 06:57

    Teşekkürler.

  • fikirbozan 06 Haziran 2008, 20:22

    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?

  • İsa Engiz 07 Haziran 2008, 10:34

    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.

  • sohbet 02 Temmuz 2008, 21:59

    tşk ederim. faydalı oldu

  • Anıl Özselgin 04 Eylül 2008, 12:10

    Çok güzel bir yazı olmuş.

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

  • sabri ünal 10 Eylül 2008, 02:08

    ö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 :)

  • caner baydemir 02 Kasım 2008, 19:54

    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?

  • İsa Engiz 03 Kasım 2008, 16:04

    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…

  • mirc 09 Ocak 2009, 11:21

    faydalı bilgiler vermeye devam.. :)

görüşünü belirt

Spam Protection by WP-SpamFree

Arama


E-Posta Aboneliği


RSS Aboneliği

En Çok Yorumlanan Yazılar

Etiketler

404 ajax apache arama butonu as astrofizik açık kaynak banner blogger blogger/blogspot Blogger / Blogspot blogspot case chmod css date dosya yükleme editör etiket etkinlik favicon featured form ftp galeri Genel gimp hata sayfası header htaccess htpasswd ilişkisel veritabanı index innodb javascript join JQuery kategori koodla linux mysql opacity php resim url

Son Yorumlar

  • isa engiz: Yazı için teşekkürler. sabit ip 2.75 tl. bu ücreti verip kendi web sunucumuzu kurabiliriz… En yakın...
  • osman: Yazı için teşekkürler. Pardus projesinin Türkiye için çok önemli olduğunu düşünüyorum. Ancak yazıda da...
  • Mustinet: siblings kullanarak da yazılabilir. Teşekkürler
  • is: CSS kullanmadan sadece HTML kodlarıyla yanyana iki sütun (tablo kullanmadan) oluşturulabilir mi?
  • Doğan Yılmaz: verdiğiniz bilgiler için çok ama çok teşekkür ederim. artık sıkı bir takipçiniz olmaya karar verdim

Sayfalar


Faydalı Bağlantılar