マスター/マルチスレーブのMySQLセットアップに移行しており、アプリケーションコードをあまり変更せずにデータの整合性の問題に取り組む方法が心配です。
このアプリケーションはORM(Doctrine PHP)を使用しており、理論的には、SELECTステートメントをスレーブの1つまたはマスターに送信し、UPDATE/DELETEクエリをマスターに送信するように拡張できます。
ORMの性質によりこれが失敗する場所は次のとおりです。
- スレーブからの古いデータに基づいて書き込みを実行します。たとえば、最近マスターで列Yが変更されたが、まだスレーブでは変更されていないスレーブからレコードを読み取り、列Yの古いデータと一緒に列Xで変更を保存します。マスター上で、したがって、列Yへの以前の変更を上書きします。
- マスターへの最近の書き込みの直後にスレーブから読み取りを行う(ユーザーがフォームを投稿したばかりのシナリオ-フォーラムのコメントを言う-そしてページをリロードしてコメントが表示されないシナリオ)
アプリケーションコントローラー上にロジックを構築して、データレイヤーが古いデータを取得する許容範囲があるかどうかを通知し、そうでない場合(たとえば、書き込みの意図がある場合)とそうでない場合にデータレイヤーができるようにする必要があると考えています。ただし、それに応じてマスターまたはスレーブに接続します。それは良いソフトウェアエンジニアリングの慣行に反しているようです。たとえば、コントローラーは、データがスレーブからのものかマスターからのものかを処理する必要のないビジネスロジックを実装する必要があります。
これは過去に対処されたと確信しています。たぶんDoctrinePHPではなく、Hibernateまたは他のORMソリューションを使用しますか?
共有できる一般的なグッドプラクティスや推奨事項はありますか?