Çerçeve bir hareket başlatmış olmadığını bilmenin bir yolu vardır. Hatta framework bunu yürütmek SQL deyimleri ayrıştırmak değil, çünkü yaklaşık bilemem $db->query('START TRANSACTION')
hangi kullanabilirsiniz.
Nokta, bir işlem başlatılmış veya yok ettik olmadığını izlemek için bir uygulama sorumluluğu olmasıdır. Bu çerçeve yapabileceği bir şey değil.
Bazı çerçeveler bunu deneyin biliyorum ve size kez eşleşen dizi taahhüt veya geri alma yaptık yalnızca onu çözmek, bir işlem başladık kaç kez saymak gibi cockamamie şeyler. Ama bu taahhüt veya geri alma aslında bunu yapacak eğer fonksiyonların hiçbiri biliyorum çünkü tamamen sahte olduğunu, ya da iç içe başka bir katman iseniz.
(Ben bu tartışmanın bir kaç kez yaşadım söyleyebilir misin? :-)
edit: Propel size bunu söylemek taahhüt etmez "iç işlem" kavramını destekleyen bir PHP veritabanı erişimi kütüphanedir. Bir işlem Başlangıçta sadece bir sayacı artırır ve taahhüt / geri alma sayacını azaltır. Aşağıda başarısız bir kaç senaryo tanımlamak bir posta listesi parçacığı bir alıntıdır.
Ya da değil gibi, işlemler "küresel" ve onlar nesne yönelimli kapsüllemeyi uymayanlar.
Problem scenario #1
I commit()
, benim yaptığım değişiklikler kararlıyız diyorsun? Ben bir "iç işlem" İçeri giriyorum eğer onlar değildir. Dış işlem yönetir kodu geri almak için seçebilirsiniz, ve benim değişiklikler benim bilgisi ve kontrolü olmadan atılacaktır.
Örneğin:
- Model A: işlem başlar
- Model A: bazı değişiklikler yürütmek
- Model B: işlem başlatmak (sessiz no-op)
- Model B: bazı değişiklikler yürütmek
- Model B: işlemek (sessiz no-op)
- Model A: rollback (atar model A değişiklikler ve model B değişikliklerin)
- Model B: WTF!? Ne benim değişiklikler oldu?
Problem scenario #2
Bir iç işlem geri alır, bir dış hareket tarafından yapılan meşru değişiklikleri atmak olabilir. Kontrol dış koduna döndüğünde, onun işlem hala etkin ve kararlı olması için mevcut olduğuna inanmaktadır. Lütfen yama ile, commit()
diyebiliriz ve transDepth şimdi 0 olduğundan, sessizce $transDepth
-1 açardı ve bir şey işlemekle sonra değil, doğru dönün.
Problem scenario #3
I commit()
veya rollback()
Etkin herhangi bir işlem olduğunda ararsanız, o $transDepth
-1 ayarlar. Sonraki beginTransaction()
işlem geri alınır, ne de taahhüt edilebilir ne demektir, 0 seviyesini artırır. Sonraki çağrılar commit()
sadece -1 veya daha fazla için işlem azaltacaktır ve başka gereksiz beginTransaction()
yeniden seviyesini arttırmak için ne kadar taahhüt muktedir asla.
Temelde, veritabanı muhasebe yapmak için izin vermeden uygulama mantığı işlemleri yönetmek için çalışırken bir mahkum fikirdir. Eğer bir uygulama isteği belirtik işlem denetimi kullanmak için iki model için bir gereklilik varsa, o zaman iki DB bağlantıları, her model için bir açmalısınız. Sonra her modeli işlenen veya birbirinden bağımsız olarak geri alınabilir kendi aktif işlem, olabilir.
(http://www.nabble.com/Zend-Framework-Db-Table-ORM-td19691776.html bakınız)