Veritabanı Hata İşleme: Sen dışında hizmet ve İşlem başarısız Çağrı zorunda ne olur?

3 Cevap php

Hepimiz her zaman böyle bir formda (veya uygun bir ORM olmadan) işlem bizim veritabanı arama, şal biliyorum:

$con = Propel::getConnection(EventPeer::DATABASE_NAME);
try {
    $con->begin();
    // do your update, save, delete or whatever here.
    $con->commit();
} catch (PropelException $e) {
    $con->rollback();
    throw $e;
}

Bu şekilde işlem başarısız olursa, veritabanı doğru durumuna geri olduğunu garanti ederim.

Ama sorun o zaman, ben bir işlem yapmak bu işlem yanı sıra, başka bir veritabanı (Ben veri bankasının bir sütunda bir girdiyi güncelleme olduğunda bir örnek olacağını güncellemeniz gerektiğinde diyelim olduğunu DatabaseB bir sütunda başka girişi olmalı ) güncellendi. Bu durumda işlemek nasıl?

Kullanıcının bu benim kod, diyelim, ben güncelleştirilmesi gereken üç veritabanları (dbA, dbB, DBC):

$con = Propel::getConnection("dbA");
try {
    $con->begin();
    // update to dbA
    // update to dbB
    //update to dbc
    $con->commit();
} catch (PropelException $e) {
    $con->rollback();
    throw $e;
}

Dbc başarısız olursa, ben dBA geri alma olabilir ama ben DBB geri alma olamaz.

Ben bu sorun veritabanı bağımsız olması gerektiğini düşünüyorum. Ben ORM kullanıyorum çünkü ve bu da bağımsız ORM olmalıdır.

Update: Some of the database transactions are wrapped in ORM, some are using naked PDO, oledb ( or whatever bare minimum language provided database calls). So my solution has to take care this.

Herhangi bir fikir?

3 Cevap

İlk olarak, bazı veritabanları dbA, DBB ve DBC her seferde aynı işlem katılmak için izin verecek bir dağıtılmış işlem protokolleri destekler. Sizinki yaparsa, bu kullanmak :)

O olmasa, bu tür two-phase-commit veya Paxos olarak, kendi dağıtık işlem protokolünü uygulamak gerekir. Bu protokoller karmaşık, ancak bu karmaşıklık absolutely necessary, bu yüzden köşeleri kesmek için cazip değil :) Ben bu wikipedia bağlantıları listelenen referanslar şu ve bu gibi bir şey uygulamak için denemeden önce bunları okuma tavsiye ederim.

Sen Distributed transactions destekleyen bir DBMS gerekir. Bunlar gerek yok tam olarak ne: Onlar birden sistemleri karşısında başlar / tamamlama / geri alma semantiğini uygulamak.

Örneğin, Enterprise Java Beans ve Microsoft Transaction Server destek dağıtılmış işlemleri.

"Dışında çağrı" bir veritabanına değilse, hatta yanıltıcıdır alır. Sen işlemleri taklit deneyebilirsiniz, ama bazı şeyler geri (dosya sistemi işlemleri) veya imkansız (bir sunucuya veri gönderme) rulo zordur. Bu yüzden belirli bir soruna bağlıdır.

En RDBMS destek dağıtılmış işlemleri. Örneğin, MS SQL Server askere, Dağıtılmış İşlem Cooridinator (DTC), bir hizmeti kullanan distributed transactions.