0

私が取り組んでいる既存のコードでは、トランザクションにラップされていない送金手順を見つけました。それは完全に受け入れられないのでしょうか、それとも必要なすべての健全性チェックがあるので問題ありませんか。つまり、送金する金額がゼロ、および残高がゼロ以上である ORM レベルの検証。

そもそもこれで私が実際に困惑した理由は、それが堅実な開発者からのものであり、それが非常に本ごとのコードであるため、トランザクションが見えないこのようなものを見るのは奇妙です:

self.balance   -= amount
save!

target.balance += amount
target.save!
4

4 に答える 4

4

コードを見ていないので、既存のコードは受け入れられないという知識に基づいた推測を行います。健全性チェックがあっても、「送金」手順のステートメントの間にその口座からの引き出しが行われると、コード内で競合状態が発生し、存在しない資金が送金されます。もちろん、多くの同時ユーザーがいる場合、この発生確率は高くなります。

于 2009-05-11T14:16:27.007 に答える
2

疑似コードを使用して、これがなぜ悪いことなのかを説明しましょう。

2回の送金:

#1: How much money does George have? $1500, that is fine.
#1: Send $1000 to Martha.
#1: Take $1000 from George.

#2: How much money does George have? $500, this is not enough.  Give up!
#2: Do not send $1000 to Martha.
#2: Do not take $1000 from George.

実際に何が起こるか:

#1: How much money does George have? $1500, that is fine.
#2: How much money does George have? $1500, that is fine.
#1: Send $1000 to Martha.
#2: Send $1000 to Martha.
#1: Take $1000 from George.
#2: Take $1000 from George.

ジョージは持っていないお金の送金に成功しました!

データベースのトラフィックが増えるほど、この種の衝突が発生する可能性が高くなります。

于 2009-05-11T14:46:12.393 に答える
2

データベース操作へのトランザクション アプローチは、特に次の 2 種類の問題にアプローチします。

  1. 同時アクセスからの保護を提供します
  2. ロールバックメカニズムを提供します

これらの 2 つをチェックで置き換える方法がわかりません...

于 2009-05-11T14:15:40.363 に答える