2011-10-24 13 views
5

Ruby On Railsで並行処理がどのように処理されているかを把握しようとしています。RORのデータベース安全並行性

データベース内の行をロックし、必要に応じて強制的にロールバックするコードセグメントを取得するにはどうすればよいですか?

さらに具体的には、特定のセグメントのコードを強制的に完全に完了させ、ロールバックしないようにする方法はありますか?プロジェクトの履歴に履歴を追加しようとしていますが、履歴が保存されていない状態でトランザクションをコミットしたくないので、サーバーが2つのアクション(トランザクションの保存と履歴の保存)違法な状態。

答えて

5

あなたがActiveRecord TransactionsPessimistic Lockingを見てみたいです。

Account.transaction do 
    account = Account.find(account_id) 
    account.lock! 

    if account.balance >= 100 
    account.balance -= 100 
    account.save 
    end 
end 
+0

データベース内の文もトランザクション内で実行できますか? – Nayish

+0

トランザクションブロック内に任意のものを入れることができます。そうすれば、if文を実行することができます。 –

+0

そしてもし最後にifが別のトランザクションから何か変わって失敗したのであれば? – Nayish

1

はい、Railsでトランザクションを実装する方法があります。例:

YourModel.transaction do 
    rec1.save! 
    rec2.save! 
end 

詳細情報here