私は敬意を表して反対しなければなりません:トランザクションシステムは自動的かつ排他的にデータベースエンジンではなく、まったく逆です...
データベーストランザクションとは異なるアプリケーショントランザクションメカニズム(.NET)を実装しました。実際にはかなり簡単です(単体テストスイートを含めて数時間の作業)。これは完全にC#で記述されており、データベース機能やその他のコンポーネントに依存することはありません。しかし、最初にいくつかのコンテキスト...
この非データベーストランザクション機能は、EJB、ESB、JMSなど、多くの場合BPMに関連付けられている、Javaプラットフォーム上のいくつかのマニフェストに存在します。これらの症状のいくつかは、基礎となるデータベースを使用しますが、常にではなく、必要がないわけではありません。MSMQなど、他のプラットフォームにも同等の症状があります。
ほとんどのレガシーバージョン管理システムは、ACIDトランザクションセマンティクスを実装していません。ddaaが言ったように、CVSはそうではありませんが、Subversion(その後継)はそうします。VisualSourceSafeはそうではありません。Subversionを調査すると、これを示す比較チャートを見つけることができます。
ここで重要な点として、データベーストランザクションまたはそれに相当するものは、安全なビジネスロジックを保証するものではありません。私はSubversionが大好きですが、皮肉なことにこの事実の素晴らしい例です。
自動ビルドスクリプト(アプリケーションをコンパイル、テスト、パッケージ化する1つのコマンド)とともにSubversionを忠実に使用し、壊れたビルドをソース管理リポジトリにコミットすることができます。私はそれを繰り返し見ました。もちろん、VSSのような非ACIDトランザクションベースのソース管理ツールを使用するとさらに簡単になります。しかし、Subversionのようなツールでそれが可能であることを知ることは多くの人々にとって衝撃的です。
シナリオをレイアウトさせてください。あなたと同僚はアプリケーションを開発しており、ソース管理リポジトリにSubversionを使用しています。どちらもコーディングを行っており、リポジトリにコミットすることもあります。いくつかの変更を加え、クリーンビルドを実行し(すべてのソースファイルを再コンパイルし)、すべてのテストに合格します。だから、あなたはあなたの変更をコミットして家に帰ります。あなたの同僚は自分の変更に取り組んでいるので、クリーンビルドを実行し、すべてのテストに合格したことを確認して、リポジトリにコミットします。しかし、同僚はリポジトリから更新し、さらにいくつかの変更を加え、クリーンなビルドを実行すると、ビルドが彼の顔に吹き飛ばされます!彼は変更を元に戻し、リポジトリから再度更新し(念のため)、クリーンなビルドがまだ爆発していることに気付きました。同僚は、ビルドとソースのトラブルシューティングに次の数時間を費やします。そして最終的に、ビルドの失敗を引き起こしている、離れる前に行った変更を見つけます。彼はあなたとあなたの相互の上司に厄介な電子メールを送り、あなたがビルドを壊してから不注意に家に帰ったと不平を言いました。あなたは朝に到着し、同僚と上司があなたの机であなたを罵倒するのを待っているのを見つけます、そして他のみんなが見ています!したがって、クリーンビルドをすばやく実行し、ビルドが壊れていないことを示します(昨夜と同じように、すべてのテストに合格します)。
では、これはどのように可能ですか?各開発者のワークステーションがACIDトランザクションの一部ではないために可能です。Subversionは、リポジトリのコンテンツのみを保証します。同僚がリポジトリから更新したとき、彼のワークステーションには、リポジトリのコンテンツ(変更を含む)と彼自身のコミットされていない変更の混合コピーが含まれていました。同僚がワークステーションでクリーンビルドを実行したとき、彼はACIDセマンティクスによって保護されていないビジネストランザクションを呼び出していました。彼が変更を元に戻して更新を実行すると、ワークステーションはリポジトリと一致しましたが、ビルドはまだ壊れていました。なんで?ワークステーションは、リポジトリへのコミットとは異なり、ACIDセマンティクスによって保護されていない別のビジネストランザクションの一部でもあったためです。クリーンビルドを実行する前に、リポジトリに一致するようにワークステーションを更新していなかったため、リポジトリに存在していたソースファイルを実際にビルドしていませんでした。このような更新を実行すると、ワークステーションでもビルドが失敗することがわかります。
これで、最初のポイントについて説明できます。トランザクションには、慎重に検討する必要のあるスコープ/コンテキストがあります。ACIDトランザクションがあるからといって、ビジネスロジックが安全であるとは限りません。ただし、ACIDトランザクションのスコープ/コンテキストとビジネスロジックが完全に一致している場合を除きます。何らかの形式のデータベースACIDトランザクションに依存しているが、そのデータベーストランザクションでカバーされていないビジネスロジックで何かを行う場合、同等の壊滅的なエラーを引き起こす可能性のあるギャップがあります。ビジネスロジックをデータベーストランザクションと完全に一致させることができれば、すべてが順調です。そうでない場合は、おそらく別の商取引が必要です。保護されていないロジックの性質によっては、独自のトランザクションメカニズムを実装する必要がある場合があります。
したがって、メッセージングはトランザクションである可能性がありますが、スコープは単なるメッセージです。上記の例に関して、Subversionのコンテキストは、リポジトリへの個別のコミットのみです。ただし、ビジネストランザクションはクリーンビルドであり、はるかに広い範囲が含まれます。この特定の問題は通常、クリーンなビルドとクリーンなチェックアウトをスクリプト化することで解決されます。理想的には、継続的インテグレーションの実装を使用します(CruiseControlなどを使用)。開発者ワークステーションでは、各開発者は、クリーンビルドの前に、完全な更新(またはクリーンチェックアウト)を実行するための規律を行使する必要があります。
したがって、要約すると、すべてのトランザクションには、その保護を制限するスコープまたはコンテキストがあります。ビジネストランザクションには、通常使用するトランザクションメカニズム(データベースエンジンなど)の範囲を超えるロジックが組み込まれていることがよくあります。あなたは違いを補う必要があるかもしれません。まれに、そうするために独自のトランザクションメカニズムを作成することが理にかなっている場合もあります。
私は、控えめな90人の会社のために重要なビジネスシステムの書き直しを設計しました。そのようなメカニズムを実装する必要があると感じ、その経験は簡単で、価値があり、やりがいのあるものであることがわかりました。おそらくもう少し簡単にやり直しますが、なぜデータベーストランザクションだけに固執できないのか常に疑問に思います。