わざとクラッシュしているRailsアプリがあります。これはローカルで、ctrl + cを押して、レコードの処理の途中で強制終了しています。
私の考えでは、ブロック内のレコードはコミットされるべきではありませんでした。これは、postgresの「エラー」またはrailsの「エラー」、またはdaveのエラーですか?
ActiveRecord::Base.transaction do
UploadStage.where("id in (#{ids.join(',')})").update_all(:status => 2);
records.each do |record|
record.success = process_line(record.id, klas, record.hash_value).to_s[0..250]
record.status = 1000
record.save();
end
end
ステータスが1であるすべてのレコードを読み取ることによってIDを生成します。
この関数以外は、ステータスを1000に設定しません。
なんらかの理由でアクションがクラッシュした場合、データベースにステータス=2のレコードがないことを期待します...これは私が見ているものではありません。レコードの半分のステータスは1000で、残りの半分のステータスは2です。
私は何かが足りないのですか?
アプリがクラッシュした場合に2がないことを確認するにはどうすればよいですか?
編集:
私はこのリンクを見つけました http://coderrr.wordpress.com/2011/05/03/beware-of-threadkill-or-your-activerecord-transactions-are-in-danger-of-being-partially-committed/