17

私はSTMを使用するclojureプログラムを書いています。現時点では、データベースからの起動時に(refsを使用して)STMにデータを入力し、dosyncトランザクションが成功するたびにデータベースを非同期的に更新しています。しかし、これを正しい方法で行っているのか、それともこれを行うためのより優れた標準的な手法があるのか​​はわかりません。ClojureプログラムでSTMのACIプロパティをACIDに変換する方法を誰かに説明してもらえますか?

4

4 に答える 4

13

一般に、ACIDの「D」をプログラムに追加することは簡単ではなく、プログラムの要件によって異なります。実装を決定する前に決定する必要がある重要な仕様が1つあります。

データベースへのマルチスレッド/マルチプロセスアクセスはありますか?

質問の本文から、プログラムは起動時にのみ読み取り、STMの変更後にのみ書き込みを行うように見えます。この場合、データベースはSTMの値よりも少し遅れます。ただし、プログラムの他のインスタンスを含む他のプログラムによってデータベースにアクセスする場合は、トランザクションの直前にデータベースへのアクセスをロックし、データベースへの書き込み後にロックを解除するロックを使用する必要があります(補足として、あなたの場合のデータベースは、ファイルシステム内の単純なファイルを含め、何でもかまいません)。複数の読み取りと書き込みがある場合、これらは両方ともデータベースに関係する副作用であるため、これを回避する方法はありません。

複数のアクセスがない場合は、プログラムがアクセス時にシングルスレッドであるため、コードが常に正常に機能することが保証されているため、非同期書き込みで問題ありません。

複数の書き込みスレッドしかなく、単一のインスタンスのみで起動後に読み取りがない場合は、正しい書き込み順序を確認するだけで済みます。これは、エージェントを使用して行うことができます。エージェントは、基本的にデータベースへの書き込み操作のキューです。参照トランザクションとエージェントの周りにdosyncをラップし、永続性に加えて耐久性を提供します。

一般に、副作用を伴う要件が複雑になるほど、ACIDを確保するために行う必要のあるトリックが多くなります。追加の要件がある場合は、私が提供した実装を変更する必要があるかもしれません。

編集:

(def db-agent (agent dummy-value))
(defn db-write [_ data] ;; make this intelligent to handle when db is not up
    (try
        (write-to-db data)
    (catch ... database fails, do a retry or let user know of problem))
    _)
;; in the transaction code
(dosync
    (alter my-ref ...)
    (send-off db-agent db-write @my-ref)) ;; ensure db gets written to
于 2010-12-29T20:14:48.563 に答える
3

あなたは興味があるかもしれません:

  1. 参照に永続性を追加するAlyssaKwanの変更されたClojureコアを参照してください: ANN:ACID保証付きの耐久性のあるref-フェーズIANN:耐久性のあるClojure-フェーズII-永続的なデータ構造ANN:耐久性のあるClojure-機能とクロージャー

  2. Sergey Didenkoのライブラリは、強力な耐久性の保証はありませんが、それに非常に近いものです: Simple-Persistence-for-Clojure

他のアプローチは、プログラマーにとってそれほど透過的ではありません。

于 2010-12-30T23:45:42.853 に答える
2

STMモデルは、システムの変更時にシステムへの複数のアクセスを追跡するのに非常に適しています。アクセスしているスレッドの存続期間を超えて変更にアクセスできる必要があるデータの永続性にはあまり適していません。

STMとは別にACIDの「D」について考えるのは一般的に良いことです

于 2010-12-24T00:06:58.737 に答える
1

高速なメモリ内アクセスがあり、時々バックグラウンドで存続するデータベースが必要な場合は、独自のデータストアを構築するのではなく、実際のデータストアを使用します。これは非常に大きな作業です。

RedisMongoDBは2つの優れたオプションですが、他にもたくさんあります。Clojureライブラリは、RedisとMongoのそれぞれhttps://github.com/ragnard/redis-clojurehttps://github.com/somnium/congomongoにあります。

于 2010-12-29T20:58:16.820 に答える