0

各トランザクションにキーが与えられる会計アプリケーションを開発しています。たとえば、販売トランザクションには、販売アカウント用と顧客用の 2 つのエントリがあります。

ID | トリッド | 日付 | アカウント | 額


112 | 33 |01-04-2013 | 売上高 | 300.00
113 | 33 |01-04-2013 | カスタマー A\c | 300.00
114 | 34 |01-04-2013 | 売上高\c |110.00
115 | 34 |01-04-2013 | 顧客 1 エアコン | 110.00
116 | 35 |01-04-2013 | 売上高 | 250.00
117 | 35 |01-04-2013 | 顧客 2 エアコン | 250.00

ここで、TRID は MAX(TRID) + 1 です。この概念はシングル ユーザー環境ではうまく機能しますが、アプリケーションが複数のユーザーによって同時に使用されるマルチ ユーザー環境では、1 人以上のユーザーが同じ TRID を取得できます。

その解決策は何ですか?

4

2 に答える 2

3

アトミック操作を作成するには、トランザクションを使用し、使用中にテーブルをロックする必要があります。これにより、2 つのプロセスが同じ値を使用しないことが保証されます。

proc をまとめる必要がありますが、基本的には次のとおりです。

-- start transaction
-- lock table
-- select max(trid) + 1 and store in a variable
-- do your inserts
-- unlock table
-- end transaction
于 2013-03-31T13:32:38.630 に答える
1

まず、TRID単独で一意にする必要がある場合は、それをキーにします (単独で、他のフィールドとの組み合わせではありません)。このように、DBMS は、クライアント コードでどんな間違いを犯しても、データベースに重複を入力させません。

マルチユーザー環境では、自動インクリメントを使用して一意の値を安全に生成できますが、生成された値が連続している必要はありません。

OTOH、「穴」を買う余裕がない場合は、次のようにします。

  • の前にテーブル全体をロックするかSELECT MAX(TRID) + 1
  • または、SELECTロックせずに同じことを行いますが、キー違反があった場合に再試行する準備をしてください。

スケーラビリティに深刻な悪影響を与える可能性があるため、できる限りロックしないことをお勧めします。

于 2013-04-01T14:36:28.563 に答える