2017-03-27 3 views
1

これは愚かな質問かもしれないが、私はいくつかの友人に尋ねてしばらくの間googledした後、まだ良い説明を見つけることができません。データの整合性とエラー処理方法

  1. MySQL.insert(ユーザー、postTitle、postBody、時間)
  2. Redis.incr user.totalPostCount
  3. Redis.set:たとえば、私は時に1件のユーザー投稿の操作に従ってください

    を行いますだから私の質問は、例えば、1成功しかし2が失敗した場合、私は何をlast10Posts

を行う必要がありますか?

redisエラーを無視して続行しますか? user.totalPostCountが間違っています。

リトライredis.incr?再試行が失敗した場合の対処方法

エンドユーザへの返信エラーはpost failと表示され、再度ユーザに投稿されますか?

以前に挿入した投稿を削除し、エラーをユーザーに返しますか?

mysql.insert({user: user, postTitle: postTitle, postBody: postBody}, function(err, mysqlId) { 
    if(err) { return Error(500); } 
    redis.incr({user: user, totalPostCount}, function(err, result) { 
    if(err) { mysql.delete(mysqlId)} 
    setLast10Post({newPost: {postTitle...}}, function(err, result) { 
     if(err) {mysql.delete(mysqlId); redis.decr({user.totalPostcount})} 
    }) 
    }) 

})

+1

なぜ閉じるの?私はそれがかなり共通だと思う。 – Sato

答えて

0

あなたはおそらく、これらの3つの操作は、単一のアトミック操作になりたいです。つまり、いずれかのステップが失敗した場合は、すべてが失敗して何も起こらないことを確認する必要があります。

したがって、シナリオ1(成功1、失敗2)では、SQLクエリをロールバックしてエラーを報告します。何かが起こったことを忘れたり、その時点でプロセス全体をやり直すことができます。

このトランザクションを実際に作成する場合、おそらくこのlinkが役に立ちます。

+0

それを単原子操作にする方法?これらの3つのステップをトランザクションにすることはできますか? – Sato

+0

コードを見ずに特定のソリューションを処方するのは難しいです。おそらくあなたはユーザーアクションのコールバックを持っていて、これらのアクションはすべてそのコールバックにカプセル化されています。そのうちの1つが失敗すると、エラーハンドラで、すでに発生していたものをロールバックしてから操作をキャンセルします。それは理にかなっていますか?厳密に言えば、途中で壊滅的な出来事が起こった場合、それは取引ではないでしょう。あなたは間違いなくそれらから実際の取引を作ることができます。 – jakeehoffmann

+0

私はいくつかのコードを追加しているので、すべてのエラーを確認して以前の操作をロールバックする必要がありますか?ロールバックの操作が失敗した場合はどうなりますか? – Sato

関連する問題