4

支店とその保有金額を追跡したいと思います。Branchesという列を持つテーブルが必要ですBalance。支店が行った取引のログを維持します。

このようなステートメントを実行するアプリケーションがあります...

UPDATE Branches SET Balance = Balance + @Amount WHERE BranchID = @BranchID

UserA残高を 100 から 120 にUserB増やし、残高を 100 から 180 に増やして、それによって行った変更が失われるという状況になるのでしょうか?UserA

4

3 に答える 3

1

[ SQL Serverに適用されますが、他の RDBMS についても同様です]その行の
更新を開始する最初のユーザーは、その行を排他的にロックします。そのため、2 番目のユーザーが同時に更新を開始することはできません。

2 番目のユーザーのトランザクションの実行が許可されるまでに、値は既に 120 に更新されているため、2 番目の更新は 120 から 200 になります。

于 2013-06-02T19:23:09.240 に答える
0

UPDATEテーブルでorINSERTステートメントが実行されるたびに、そのテーブルでロックが取得されます。このロックにより、このような競合が発生することはありません。

ユーザー 1 が値を更新し、トランザクションが終了すると、ユーザー 2 も値を更新できるようになります。

RDBMS はACID 原則を尊重し、このようにして異なるステートメントの実行が分離されます。この問題の競合について心配する必要はありません。

于 2013-06-02T19:23:13.017 に答える
0

これは、テーブルが何らかの形で破損していない限り、どの SQL サーバーでも問題になることはありません。通常、SQL サーバーは更新のためにテーブルをロックし、次の更新のために解放します。リクエストが同時に入った場合、一方が他方より先に実行されますが、どちらも破棄されません。

于 2013-06-02T19:23:56.607 に答える