0

データベース トランザクションの ACID プロパティの A からのアトミック性は、データベースで実行される各トランザクションが 0 または 1 の 2 進数システムのようなものであり、すべてまたは何もないことを示しています。

Java や C# などのプログラミング言語、またはその他の汎用言語で同じことを達成することは可能ですか? 例えば

public static Ticket GetTicket(string filePath) {
  counter++;
  Application app = new Application(filePath);
  .
  .
  .

おそらく、私は悪い例を挙げていますが、アイデアを得るにはこれで十分だと思います。ここで、Applicationオブジェクトを作成している行で例外がスローされた場合、アプリケーションの実行が停止し、静的変数の状態counterが既に変更され、システムの状態が変化したと想像してください。例外がスローされる前に実行されたステートメントによる損害を防ぐ方法はありますか?

4

4 に答える 4

5

Java と C# でライブラリを実装するソフトウェア トランザクショナル メモリについて考えています。

于 2013-07-29T17:41:24.590 に答える
1

このような機能の最も簡単なメカニズムは次のとおりです。

  1. 次のステートメントによって変更されるオブジェクトのクローンを作成します
  2. 複製されたオブジェクトを変更する
  3. 複製されたオブジェクトを指すように参照を更新します

そうすれば、オブジェクトへの参照の変更は、最終ステップまで実際には観察されません。

ただし、より具体的な質問がなければ、これに正しく答えるのは難しいでしょう。

于 2013-07-29T17:46:20.570 に答える
0

すべての可変状態を不変オブジェクトにカプセル化します。

不変オブジェクトには、パブリック getter プロパティによってカプセル化された (プライベート) 読み取り専用フィールドのみが含まれるのが理想的です。すべてのフィールドは、コンストラクタ (または静的ファクトリ メソッド) に渡されたデータで初期化する必要があります。

このような不変オブジェクトを使用すると、トランザクションのセマンティクスを提供する (リフレクション以外で) 状態を部分的に更新できないことが保証されます。

状態の一部を変更したいものはすべて、そのすべての状態が適切に設定された不変オブジェクトの新しいインスタンスを構築して返す必要があります。

(不変インターフェイスを使用して不変オブジェクトを表すこともできますが、インスタンスが実際には可変オブジェクトである可能性があるため、インターフェイスを介して参照されるオブジェクトが変更されないことを保証することは困難です。)

于 2013-07-29T18:00:25.973 に答える
0

いくつかの変数などでイベントを撮影する前に、すべてのステータスを保存します。次に、try catch 構造で変更を行います。キャッシュ内で、すべての変更を元のステータスにロールバックします

int a = 5;
int b = 1;

int a2 = a;
int b2 = b;

try
{
 a += 10;
 b -= 1;
 a /= b;
}
catch(Exception ex)
{
 //roll back;
 a = a2;
 b = b2;
}
于 2013-07-29T17:56:28.630 に答える