7

私はちょうど RDBMS について読んでいましたが、RDBMS の 1 つの特性は原子性です。したがって、お金が口座から引き出され、別の口座に送金された場合、取引は完全に行われるか、まったく行われません。部分的な取引はありません。しかし、実際にはどのように確保されているのでしょうか?

上記のシナリオの SQL クエリは次のようになります (i) UPDATE accountsset balance = balance - amount WHERE ac_num = 101 (ii) UPDATE accountsset balance = balance + amount WHERE ac_num = 102

これは決して原子性を保証するものではありません..では、実際にはどのように起こるのでしょうか?

4

2 に答える 2

8

もし、するなら

BEGIN TRANSACTION
UPDATE accounts set balance = balance - amount WHERE ac_num = 101
UPDATE accounts set balance = balance + amount WHERE ac_num = 102
COMMIT TRANSACTION

データベースシステムは、アカウント101での変更に対して行われたことをメモします。その後、アカウント102での作業が失敗した場合、RDBMSはそれらのメモを使用して101での作業を元に戻します。

さらに、アカウント101で作業を開始すると、データベースがロックされるため、アカウント101で更新されたがコミットされていないデータを他の人が読み取れるようになります(ここでのロックは、基本的にどこかにあるメモです。 "私はここで働いています、触れないでください。」)

于 2009-03-28T10:25:58.440 に答える
4

アトミックであるためには、トランザクションは次のことを行う必要があります。

  • 他のトランザクションが書き込みまたは読み取り中の行に干渉しないようにする
  • トランザクションがコミットするときに、トランザクションが行う変更のすべてまたはまったくがデータベースにないことを確認してください。

最初の 1 つは、実行中にトランザクションが読み書きする行をロックすることによって実現されます。

2 つ目は、トランザクションがアクションをトランザクション ログに書き込むためです。これにより、トランザクション中にサーバーの電源が失われた場合でも、データベースを回復できます。この場合、回復プロセスはログを読み取り、アクティブな (コミットされていない) トランザクションが中止され、トランザクションによる変更がキャンセルされることを確認します。

于 2009-03-28T11:58:09.717 に答える