3

私はSTMが本当に好きですが、特にトランザクションの1つのブロックが別のブロックに依存している場合に、トランザクションを適切に使用する方法についてアドバイスをもらいたいと思っています。

たとえば、私はいくつかのコードを持っています:

(defn unschedule-task [tt task-id]
  (dosync
   (doseq[エントリ.....]
    (tk / kill-all!(:task entry)))
   (v / delete!tt [[:task:id] task-id])))

(defn schedule-task [tt task schedule&[enabled?optt]]
  (dosync
   (unschedule-task tt(:id task))
   (v / insert!tt {.....})))

基本的にunschedule-taskdosyncブロックがあり、1つのトランザクションで実行するには削除と挿入の両方が必要なため、独自のブロックをschedule-task呼び出します。unschedule-taskdosync

これをどこまで推し進めることができ、避けるべき落とし穴は何ですか?(循環依存に問題があるかもしれないと思っていますが、頭のてっぺんから例を考えることはできません...)

4

1 に答える 1

1

トランザクションはフラット化されます。トランザクション中に新しいトランザクションを開始しても、何も起こりません。IOW、すべての参照変更が外部トランザクション中に成功するか、外部トランザクション全体が再開されます。これは、依存関係の問題がないことを意味します。

于 2012-11-19T08:18:36.143 に答える