質問

私はRDBMSについて読んでいただけで、RDBMSの1つの特性は原子性です。したがって、お金が口座から撤回され、別のアカウントに転送された場合、取引は完全に発生するか、まったく発生しません。部分的なトランザクションはありません。しかし、実際にどのように保証されますか?

上記のシナリオのSQLクエリは(i)更新のように見えるかもしれません accounts BALANCE = BALANCE -AC_NUM = 101(ii)アップデート場所 accounts 残高 = 残高 + 金額を設定 WHERE ac_num = 102

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

役に立ちましたか?

解決

その場合は、

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

データベース・システムは、アカウント102上の作業が失敗する場合は、アカウント101そして上の変更のために行っているものにメモを書くだろう、RDBMSは101の作業を元に戻すには、これらのノートを使用します。

は、さらに、それはアカウント101上で作業を開始したときである誰-1アカウント101内のデータを犯し来ないと読んで更新しますが、できないように、データベースのロックを取ります。 (ここではロックは基本的にどこかにちょうどノートである「私は触れないでください、ここで働いています。」)

他のヒント

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

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

最初の 1 つは次のようにして達成されます ロックする トランザクションが実行中に読み書きする行。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top