Ne veritabanı iletişim ile ilgili bir şey yanlış giderse ne yapmam gerekir?

3 Cevap

İşte sorun: Bir komut veritabanı değiştirerek başlar ve bir şeyler yanlış gittiğinde, veritabanı genellikle bozuk. Örneğin, bir kullanıcı tablo ve Resimleri tablo var diyelim.

Bir komut dosyası, bir kullanıcı veri kümesi oluşturur ve bir sonraki hatlarında bir fotoğraf veri kümesi oluşturmak için çalışır. Fotoğraf bir User_id sütun vardır. Şimdi bir şeyler yanlış gider ve PDO'su lastInserId () kullanıcı id dönmez varsayalım. Peki kötü durumda olur: Biz hiçbir fotoğrafı ile bir kullanıcı ve hiçbir geçerli user_id bir fotoğraf olsun. Kırık referans. Debug 3 hafta.

Sorunların tam olarak bu tür önlemek için, takip için herhangi bir iyi stratejileri var mı? Aşağıda benim kodda, ben en azından bir dosyaya bu oturum ve daha fazla hasar ve db curruption önlemek için komut dosyası yürütme bırakmayı deneyin görebilirsiniz.

public function lastInsertId() {
    $id = $this->dbh->lastInsertId();
    if (!is_numeric($id)) {
        $this->logError("DB::lastInsertId() did not return an id as expected!");
        die();
    }
    return $id;
}

Belki bir sorgu B benzeri bir sorgu A bağlıdır, ve herhangi bir zamanda, her yerde İşlemler kullanmak zorunda? Çözüm gitmek için mi?

Ben kalıp önce bir "önlem geri alma" yapmalıyım () diyoruz? Ben o olur, bu noktada çok zarar olmaz sanırım? Ben emin değilim ...

3 Cevap

Atomsallık: O A ACID arasında bulunuyor - çözüm işlemi bunu "ya hep ya hiç", evet olması gereken birkaç sorunuz varsa her zaman kullanmak olacaktır.

İsterseniz, sizin die önce rollback yapabilirsiniz; o (a transaction that is not commited will automatically be rolled-back by the DB engine) fazla bir değişiklik olmaz, ama anlamak kolay kod daha net yapmak ve olacaktır.


As a sidenote : using die this way is probably not the "right" way to deal with errors : it'll prevent you from displaying any kind of "nice" error page, for instance.

Bir hata sayfası görüntülemek ve uygulama bu istisnalar ile (in one single place) anlaşma daha yüksek bir katmanında, - daha sık kullanılan bir çözüm dışında bir çeşit sorun bu tür olduğunda atılmış olmasıdır.

İlgili atom faaliyetleri (Eğer MySQL kullanıyorsanız InnoDB, ya da sadece PostgreSQL, vb kullanabilirsiniz) bir işlem motoru kullanarak ve sarma dışında yapabileceğiniz büyük bir anlaşma değil.

@ Seb söylediği gibi, bir işlem günlüğü oluşturabilir ve hatta bir master / slave veritabanı kurulum kullanabilirsiniz, ama bu gerçekten kapsama açısından çok eklemek olmaz.

Siz tüm işlemlerin bir kaydını tutmak gerekir, bu yüzden otomatik bir süreç (hatta rollbacks, dönüş işlemleri, vb) yanlış giderse, hala elle geri tüm efektleri dönebilirsiniz.