データベース外でトランザクション動作が必要になることはありますか?
-
08-07-2019 - |
質問
トランザクションのないデータベースでは、複雑なことは何もしません。ほとんどの場合、組み込みコマンドを使用するのは簡単です。しかし、他の永続データを使用して作業を開始するとき、トランザクションサポートを使用するのは簡単ではありません。いくつかの例があります
- ファイルシステム
- Webサービス(使用したものはありません)
非永続データであっても、例外に続いて作業ブロックを取り消すと役立つことがよくあります。言語で取得する標準データ構造はどれも、トランザクションをサポートしていません。
知りたいのは、なぜデータベースが特別な場合なのかということです
データベース外のトランザクション動作のトピックへの便利なリンクはありますか?
解決
私は敬意を払わなければなりません:トランザクションシステムは自動的に排他的にデータベースエンジンではなく、まったく逆です...
データベーストランザクションとは異なるアプリケーショントランザクションメカニズム(.NET)を実装しました。実際にはかなり簡単です(単体テストスイートを含む数時間の作業)。データベース機能や他のコンポーネントに依存することなく、完全にC#で記述されています。しかし、最初にいくつかのコンテキスト...
この非データベーストランザクション機能は、EJB、ESB、JMSなど、多くの場合BPMに関連するJavaプラットフォーム上のいくつかのマニフェストに存在します。これらの症状のいくつかは、基礎となるデータベースを使用しますが、必ずしもそうではなく、必ずしも必要ではありません。他のプラットフォームには、MSMQなどの同等の症状があります。
ほとんどのレガシーバージョン管理システムは、ACIDトランザクションセマンティクスを実装していません。 ddaaが言ったように、CVSはそうではなく、Subversion(その後継)がそうです。 Visual Source Safeはサポートしていません。 Subversionを調べると、これを示す比較チャートを見つけることができます。
重要な点については、データベーストランザクションまたはそれに相当するものは、安全なビジネスロジックを保証しません。私はSubversionが大好きですが、皮肉にもこの事実の素晴らしい例です。
Subversionは、自動ビルドスクリプト(アプリケーションをコンパイル、テスト、およびパッケージ化する1つのコマンド)とともに宗教的に使用でき、破損したビルドをソース管理リポジトリにコミットできます。私はそれを繰り返し見ました。もちろん、VSSなどの非ACIDトランザクションベースのソース管理ツールを使用すると、さらに簡単になります。しかし、多くの人々にとって、Subversionのようなツールでそれが可能であることを知るのは衝撃的です。
シナリオのレイアウトをお願いします。あなたと同僚がアプリケーションを開発し、ソース管理リポジトリにSubversionを使用しています。あなたとあなたの両方がコーディングをし、時々リポジトリにコミットしています。いくつかの変更を行い、クリーンビルドを実行し(すべてのソースファイルを再コンパイル)、すべてのテストに合格します。したがって、変更をコミットして家に帰ります。同僚は自分の変更に取り組んでいるので、クリーンビルドも実行し、すべてのテストが成功したことを確認して、リポジトリにコミットします。しかし、同僚はリポジトリから更新し、さらにいくつかの変更を加え、クリーンビルドを実行し、ビルドが爆発します!彼は変更を元に戻し、リポジトリからの更新を(確かに)再度行い、クリーンビルドがまだ爆発していることに気付きます!同僚は、ビルドとソースのトラブルシューティングに数時間費やし、最終的にビルドの失敗の原因となっている変更を見つけます。彼は、あなたとあなたの上司に、あなたがビルドを破って不注意に家に帰ったと文句を言って、嫌なメールを送ります。朝になって同僚と上司がデスクで待っているのを見つけるために到着し、他のみんなが見ています!したがって、クリーンビルドをすばやく実行し、ビルドが壊れていないことを示します(昨夜と同様に、すべてのテストに合格します)。
では、これはどのように可能ですか?各開発者のワークステーションはACIDトランザクションの一部ではないため、可能です。 Subversionは、リポジトリのコンテンツのみを保証します。同僚がリポジトリから更新したとき、彼のワークステーションには、リポジトリの内容(変更を含む)とコミットされていない変更の混合コピーが含まれていました。同僚が自分のワークステーションでクリーンビルドを実行したとき、彼はACIDセマンティクスによって保護されていないビジネストランザクションを呼び出していました。彼が変更を元に戻し、更新を実行したとき、彼のワークステーションはリポジトリと一致しましたが、ビルドはまだ壊れていました。どうして?ワークステーションは、リポジトリへのコミットとは異なり、ACIDセマンティクスによって保護されていない別のビジネストランザクションの一部でもあったためです。実行する前にリポジトリに合わせてワークステーションを更新していなかったため
他のヒント
トランザクションがデータベースでのみ表示される理由は、定義上、トランザクションを提供するシステムはデータベースと呼ばれるためだと思います。それは円形に聞こえるので、詳しく説明する必要があります。
トランザクションサポートは、 ACID プロパティを提供する機能です。簡単に言うと、トランザクションは、1。多数の慎重な操作を1つのパッケージにまとめて、全体として成功するか、全体として失敗することを意味します。常に「一貫性」があるシステムのビュー。
ファイルシステムは従来、ロックメカニズムを提供しており、ただし、これはトランザクションの提供とは異なります。ただし、すべてのファイルシステムにはいくつかのアトミックプロパティがあります。たとえば、ディレクトリ / a /
および / b /
があり、同時に mv / a / b / a
を実行しようとすると、 mv / b / a / b
、整合性を損なうことなく、これらの操作のうち1つだけが成功します。一般的にファイルシステムに欠けているのは、複数の操作を1つの分離されたアトミックバンドルにバンドルする機能です。
回答はSubversionに言及しています。すべての健全なバージョン管理システムにはトランザクションがあります。複数のファイルにコミットする場合、システムはコミットを完全に適用するか、完全に拒否します(CVSを除き、正気とは見なしません)。拒否の原因は常に同時的な変更です。バージョン管理システムの実装者は、データベースの維持を非常に意識しています。
別のの回答では、メッセージングシステムがトランザクションとして言及されています。リンクされた資料は読みませんでしたが、答え自体はメッセージのアトミック配信のみに言及していました。それはトランザクションではありません。
したがって、Clojureを除いて、トランザクションを必要とするシステムは、基礎となるデータベースを使用するか、それ自体をデータベースに変換するようです。
最新のファイルシステムにはトランザクションがあります。これらはエンドユーザーに対して透過的です。
NTFS、XFS、JFS、EXT3、およびReiserFSのすべてが、ほんの数例を挙げます。
そして、それはファイルシステムの内部にすぎません。多くのOSは、排他(書き込み)および共有(読み取り)ロックを使用したファイルロック(たとえば、* NIXの世界ではflock(2)を参照)もサポートしています。
編集: 考えてみると、ファイルシステムには、最新のDBのような分離レベルはありません。ファイルの読み取りが完了したら、ロックしていない場合は、通常、ファイルを閉じるからです。次に、書き込みたいときに再び開きます。
Clojure はソフトウェアトランザクションメモリ。トランザクションを使用して、手動ロックなしでマルチスレッドプログラムを簡単かつ安全に作成できます。 Clojureには変更可能な参照を含む不変のデータ構造があり、参照を変更するにはトランザクションが必要です。
メッセージングシステムは、トランザクションリソースマネージャーの別の例です。
つまり、メッセージコンシューマがキューからのメッセージを正常に処理できることを確認できます。処理が失敗した場合、メッセージはキューに残ります。
さらに、メッセージングシステムは別のリソースマネージャーとの分散トランザクションに参加できます。
詳細情報
Subversionのコミットはトランザクションです。本当にアトミックであるため、コミットが中断されてもリポジトリが矛盾した状態になることはありません。
ファイルシステムとデータベースを1つのトランザクション単位として扱う必要がある状況がありました。
私の場合、ファイルシステムにファイルのセットをダウンロードするだけでした。毎回ランダムなディレクトリを作成し、そこにデータを入れて、データベーステーブルにディレクトリ名を保存することでそれを行いました。したがって、すべてのデータベース作業、およびデータベーステーブル内のディレクトリ名(=ファイルシステム作業)は、1つのデータベーストランザクションで実行できます。
http://www.databasesandlife.com/atomic-operations -over-filesystem-and-database /