MySQL’de Transaction ve PHP ile kullanımı
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.

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!
- 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ış.
görüşünü belirt
Arama
E-Posta Aboneliği
RSS Aboneliği
En Çok Yorumlanan Yazılar
- Blogger’da “devamını oku” bağlantısı (21)
- Ajax ile dinamik listeleme (21)
- MySQL’de Transaction ve PHP ile kullanımı (16)
- PHP ile sınırsız alt kategori mantığı (14)
- Kullanıcı dostu url hazırlamak (12)
- PHP’nin (muhtemelen) az bilinen 10 özelliği (12)
- Kullandığınız programlama dili ne kadar popüler? (12)
- MySQL’de “join” kullanımı (11)
- .htaccess konuları [Giriş] (11)
- Blogger’da arama kutusu ekleme (10)
Etiketler
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
25 / Mayıs / 2008
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
İ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
Tebrikler, güzel bir yazı olmuş ve önemli bir konuya değinmişsiniz.
Teşekkürler, sizin beğenmenize sevindim
Çok güzel bir anlatım, biraz teorik bilgim olmakla beraber toplam 15-20 saniyede (ara metinleri atlayarak) okuyabildim. Elinize sağlık.
Harika bir özellik, tek kötü yanı MyIsam’da çalışmaması sanırım.
Bu güzel yazı için teşekkürler.
güzel ve faydalı bir yazı olmuş tebrikler
Teşekkürler.
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?
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.
tşk ederim. faydalı oldu
Çok güzel bir yazı olmuş.
Diliniz çok yalın, rahat anlaşılıyor.
ö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
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?
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…
faydalı bilgiler vermeye devam..