2016-10-11 30 views
0

私はfsで問題が発生しました。 SQLユニバースでは、失われた更新と呼ぶでしょう。node.js更新が失われたJSONファイル

背景ストーリー:
私はJSONファイルにユーザーによって提供されるいくつかのデータを格納する必要があり、小さなアプリケーションを、得た:

[ 
    { 
    "givenname": "Joe", 
    "surname": "Doe", 
    "dob": "1990-04-01" 
    }, 
    { 
    "givenname": "Tim", 
    "surname": "Cake", 
    "dob": "2000-01-01" 
    } 
] 

そして、私は、ファイル更新するために、いくつかのJSを得た:

// sync 
var data = JSON.parse(fs.readFileSync(data_path, 'utf8')); 
data.push(user); 
var str = JSON.stringify(data); 
setTimeout(function() { 
    fs.writeFileSync(data_path, str); 
    res.send({'status': 'success'}); 
}, 5000); 

// same story but async 
fs.readFile(data_path, 'utf8', function (err, _data) { 
    if (err) throw err; 
    var data = JSON.parse(_data); 
    data.push(user); 
    setTimeout(function() { 
     fs.writeFile(data_path, JSON.stringify(data), function (err) { 
      if (err) { 
       console.log(err); 
       res.send({'status': 'error'}) 
      } 
      res.send({'status': 'success'}) 
     }) 
    }, 5000); 
}); 

SetTimeout(..., 5000)を挿入して、アプリケーションのテストにもう少し時間をかけました。

私はそれは、たとえば{"givenname": "g02", "surname": "s02", "dob": "2016-02-02"}のために、最初のレコードの同期または非同期、私はアプリにいくつかのデータを投稿した場合、たとえば{"givenname": "g01", "surname": "s01", "dob": "2016-01-01"}用と5秒以内に他のいくつかのデータをポストしなければどんなに(G01を、S01)となります失われた
私が知っていることは、ファイルを読み書きする時間がはるかに短くなることは分かっていますが、明らかにそれが存在し、データが破損する可能性があります。

だから私の質問は次のとおりです。
データの損失を回避する可能性はありますか?

答えて

0

ファイルは実行Aによって読み取られ、5秒間スリープされます。一方、実行Bはファイルを読み取り、5秒間待機します。その後、Aが出力を書き込み、Bは出力を書き込みますAの前の出力をに上書きします。それは、(読み取りと書き込みのためのあなたのプロセスをロック)、特にスケーラブルではありません

var data = JSON.parse(fs.readFileSync(data_path, 'utf8')); 
data.push(user); 
var str = JSON.stringify(data); 
fs.writeFileSync(data_path, str); 
res.send({'status': 'success'}); 

、しかし:睡眠がうまくいくないファイル、あなたはを持つ同期バージョンにアクセスして、単一のプロセスのために

それが動作します。

+0

私は何が起こっているのか知っていますが、同期が完璧に機能することはわかりませんでした。どうも。 – Alex

関連する問題