データベース通信に関連する問題が発生した場合はどうすればよいですか?

php
データベース通信に関連する問題が発生した場合はどうすればよいですか?

問題は次のとおりです。スクリプトがデータベースの変更を開始し、何か問題が発生すると、通常データベースが破損します。 たとえば、UserテーブルとPhotosテーブルがあるとします。

スクリプトはユーザーデータセットを作成し、次の行で写真データセットを作成しようとします。 写真にはuser_id列があります。 何かがうまくいかず、PDOのlastInserId()がユーザーのIDを返さないと仮定しましょう。 最悪の場合に何が起こるか:写真のないユーザーと、有効なuser_idのない写真を取得します。 壊れた参照。 デバッグに3週間。

まさにこの種の問題を防ぐために従うべき良い戦略はありますか? 以下の私のコードでは、少なくともそれをファイルに記録し、スクリプトの実行を終了して、さらなる損傷とデータベースの破損を防止しようとしていることがわかります。

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;
}

クエリBがクエリAに依存している場合など、随所でトランザクションを使用する必要があるかもしれません。 それが解決策ですか?

die()呼び出しの前に「予防ロールバック」を行う必要がありますか? この時点ではあまり痛くないでしょうね。 よく分かりません…​

  0  0


ベストアンサー

解決策は、「すべてまたはなし」である必要があるいくつかのクエリがあるたびにトランザクションを使用することです。はい-それはhttp://en.wikipedia.org/wiki/ACID#Atomicity[ACIDの* A *です]:原子性。

必要に応じて、「ダイ」の前に「ロールバック」を実行できます。あまり変更されません_(コミットされていないトランザクションはDBエンジンによって自動的にロールバックされます)_が、コードがより明確になり、理解しやすくなります。

 +
サイドノートとして:この方法で `die`を使用することは、エラーを処理するための「正しい」方法ではない可能性があります。

より頻繁に使用される解決策は、そのような種類の問題があるときに何らかの種類の例外をスローすることです-そして、アプリケーションの上位層で_(単一の場所で)_それらの例外を処理し、エラーページを表示します。

5


トランザクションエンジン(http://dev.mysql.com/[MySQL]を使用している場合はInnoDB、または単にhttp://www.postgresql.org [PostgreSQL]などを使用している場合)を使用して、関連するアトミックアクティビティはそれほど多くありません。

@Sebが言うように、トランザクションログを作成することができ、マスター/スレーブデータベースのセットアップを使用することもできますが、これはカバレッジの面ではあまり追加されません。

1


すべてのトランザクションのログを保持する必要があります。そのため、自動化プロセスが失敗した場合(ロールバック、フォールバック手順など)でも、すべての効果を手動で元に戻すことができます。

0


タイトルとURLをコピーしました