Birçok PHP İstekler karşısında MySQL İşlem

5 Cevap php

Ben bir işlem benzeri şekilde fatura işlemek için bir arayüz oluşturmak istiyoruz.

Veritabanı faturalar için satır öğeleri tutar fatura bilgilerini tutan bir fatura tabloda, ve bir invoice_lines tablo oluşur. Web sitesi fatura ve bunlara karşılık gelen hatların eklenmesi, modifikasyonunu ve kaldırılmasına izin komut bir dizi.

Ben sorunu bu, ben web uygulaması yansıtılması veritabanı ASİT özelliklerini istiyorum.

  • Atomic: kullanıcı hits tüm fatura değiştirilmiş veya tüm fatura hiç değişmez, ya kaydettiğinizde.
  • Consistent: uygulama kodu zaten tutarlılık sağlar, çizgileri olmayan faturalara ilave edilemez. Fatura kimlikleri taklit edilemeyen.
  • Isolated: Bir kullanıcı bir faturaya değişikliklerin bir dizi ortasında ise, ben kullanıcı tıklama kaydetmek kadar diğer kullanıcılardan bu değişiklikleri gizlemek istiyorum.
  • Durable: web sitesi ölürse, veri güvenli olmalıdır. Bu zaten çalışır.

Ben bir masaüstü uygulaması yazma olsaydı, bana sadece düzenlemek başında ve sonunda BEGIN TRANSACTıON'ı kullanmak ve yürütme için izin, her zaman MySQL veritabanı için bir bağlantı korumak olacaktır.

Den ne anlamak Bir PHP sayfada TRANSACTıON'ı BEGIN edemez ve bağlantı sayfaları arasında kapalı olduğundan farklı bir sayfada COMMIT.

Uzantıları olmadan bu mümkün kılmak için bir yolu var mı? Ben ne bulduk itibvardırn, sadece SQL Relay bunu yapar (ama bir uzantısıdır).

5 Cevap

Bu eşzamanlılık sınırı olacak çünkü, uzun süren işlemler için istemiyorum. http://en.wikipedia.org/wiki/Command_pattern

Işlem bu tip web çeviri oturum veri veya sayfanın kendisi depolanan verilerin kullanılmasıdır. Tipik olarak ne yapılır, her web sayfası tamamlandıktan sonra veriler ve bir "Süreci" ((veri girişi yoluyla) oturumda (veya sayfanın kendisi) ve tüm sayfaları tamamlanmış olduğu noktasında kayıtlı olmasıdır ya da "Kaydet") düğmesi vurmak, veri veritabanı forma dönüştürülür ve kaydedilir - Senin gibi verilerin ilişkisel yönü söz konusu bile. Bunu yapmanın birçok yolu vardır ama ben en geliştiriciler seni ne konuştuğunu karşılamak için (sayfa içinde oturum verilerini veya devlet kullanarak) sözü ne benzer bir mimariye sahip olduğunu söyleyebilirim.

Burada farklı mimarileri çok tavsiye alırsınız ama Zend çoğunu sağlayan beri Zend Framework (http://framework.zend.com) ve Doktrin kullanımı (http://www.doctrine-project.org/) Bu peri kolay olduğunu söyleyebiliriz artı diğer tüm yönleriyle (tekliği, taahhüt, geri alma, vb) - MVC mimarisi ve oturum yönetimi ve Doktrin temel CRUD (oluşturmak, almak, güncelleme, silme) aradığınız sağlar. Mysql açık bağlantı tutmak zaman aşımı ve bağlantıları mevcuttur eksikliği neden olabilir.

Veritabanı işlemleri gerçekten bu amaç için uygun değildir - onları kullanmak olsaydı, muhtemelen diğer sorunlarla çalıştırmak istiyorum.

Her sayfa isteği kendi bağlantısı (potansiyel) kullanır, böylece herhangi bir başkaları ile bir işlem veremiyoruz gibi ama aynı zamanda bunları kullanamazsınız.

Kullanıcı bunları düzenleme ise o kaydetmek çarptığında sonra bunları uygulamak, başka bir yerde faturaya değişiklikler tutun; Eğer (oldukça kısa ömürlü de olsa) bir işlemde bu son adımı uygulayabilirsiniz yapabilirsiniz.

Uzun ömürlü işlemleri genellikle kötü.

Çözelti GET aşaması sırasında işlem açık değildir. Tüm yönleriyle mutlaka işlem-BEGIN İŞLEM, işleme ve COMMIT-tüm "save" butonu ile tetiklenen POST sırasında.

Bazı iyi cevaplar vardır taşıyamazsınız, ben de sıkışmış olduğunu, sorunuzun bazı iyi yanıtları bulundu düşünüyorum. Ben en iyi yaklaşım bir şekilde uygulanan bu tür bir yaklaşımı vardır Doktrini gibi bir çerçeve (O / R mapping) kullanarak düşünüyorum. Here Sana bahsettiğimi bir bağlantı var.