2012-04-01 13 views
1

私はデータベースアプリケーションが新しく、私はRuby Webアプリケーションを作成するためにDatamapperを使用しようとしています。データベース内のトランザクションの理解

transaction do |txn| 
    link = Link.new(:identifier => custom) 
    link.url = Url.create(:original => original) 
    link.save 
end 

を私はいくつかの質問を持っている:

は、私は理解していないコードのこの部分に出くわし正確取引は何ですか?そして、これを行うのではなく、なぜこれを優先したのですか。

link = Link.new(:identifier => custom) 
link.url = Url.create(:original => original) 
link.save 

トランザクションの使用はどうすればよいですか?ベストユースケースは何ですか?そのような概念についてもっと読むことができる、オンラインで利用可能なリソースはありますか?

ありがとうございます!

答えて

3

トランザクションは不可分な作業単位です。このアイデアはデータベースの世界に由来し、データの選択/更新の問題に関連しています。

  1. ユーザーAはオブジェクトOを変更するように要求します。
  2. Aさんが自分のものをやっているうちに、Bさんは同じ物を尋ねました。現在、オブジェクトOは両方のユーザーで等しいです。
  3. 次に、プロパティO1をオブジェクトOに変更して、データベースに更新を置きます。ユーザーBにはこの変更がありません。オブジェクトOは以前と同じです。
  4. Bは、変更されたプロパティO2を持つデータベースへの更新をオブジェクトOに置きます.O1への変更は実質的に失われます。

基本的には、マルチユーザーのアクセスや変更に関係します。いくつかの問題が発生します。

トランザクションは、異なる操作を1つの論理処理文に結合するためにも使用されます。たとえば、関連付けられているすべての写真を含むユーザーを削除する必要があります。

トピックは実際には1つの投稿でカバーするのが大変ですので、記事wiki#1wiki#2を読むことをおすすめします。

+0

+1。トランザクションが使用されている場合、同じ状況で何が起こるかを明確にすることができますか?トランザクションは行をロックするので、トランザクションの進行中にユーザーBはオブジェクトOにアクセスできません。私はちょうど興味があります... –

+0

実装がいくつかありますが、基本的にはyesです。操作が完了するまで、行/テーブル/データベースはロックされています。実際にはいくつかのレベルの分離があります - http://en.wikipedia.org/wiki/Isolation_(database_systems) –

+0

ありがとう、あなたのWikiリンクを読んで学習しています... –

1

トランザクションは、実行時に1つのアトミック命令と見なされる一連の命令です。

これは、トランザクションが成功するためには、すべての命令が成功しなければならないことを意味します。そのうちの1つだけが失敗した場合は、トランザクションの開始前の状態に戻ります。これはフォールトトレランスに適しています。

トランザクションが有効な他のフィールドは、並行アプリケーションです。トランザクションを使用すると、他のプロセスによる干渉を回避できます。

これが役に立ちます。

関連する問題