1

PHPを使用してMySQLで次のクエリを使用しています

$sql = SELECT MAX(SrNo) FROM cart;
$result = mysql_query($sql);

テーブル CART の構造は

CART (SrNo int(10));

現在、結果を使用して何らかの処理を行い、1 をインクリメントして最大値をこのテーブルに挿入しています。私の問題は、user1 が最大値を取得しておりSrNo、処理の中間にある場合です。この間、user2 も、user1 が取得したのと同じ SrNo の最大値を取得し、処理を開始することをサーバーに要求します。

両方の処理とテーブルへの挿入が完了すると、テーブル CART に 2 つの複製が作成されます。どうすればこれを防ぐことができますか?

SrNoつまり、 1 人のユーザーが処理を終了しない限り、他のユーザーが untilの最大値を取得しないようにしたいと考えています。

4

3 に答える 3

1

リクエストごとに新しい接続を作成する Web アプリケーションでは、これは簡単なことではありません。このテーブルに列lockedByを追加し、ロックを要求したユーザーの名前と、ロックが要求されたときのタイムスタンプを入力する必要があります。特定の時間より長いロックを無視できるように、タイムスタンプが必要です。lockedTimeID

于 2011-08-10T20:10:55.410 に答える
0

テーブルの主キーとしてSrNoを設定すると、行を追加しようとする2番目の時間が失敗し、失敗した場合は、新しい番号を要求できます。

ALTER TABLE cart ADD PRIMARY KEY (SrNo);
于 2011-08-10T20:26:01.353 に答える
0

PRIMARY KEYのAUTO_INCREMENT機能でよろしいでしょうか?

create table cart ( SrNo int(10) AUTO_INCREMENT PRIMARY KEY ) ENGINE = InnoDB;

次に、新しい行を挿入するだけで、新しい値が自動的にインクリメントされます。それはおそらくあなたがしようとしている(多分?) トリックを非常に簡単に行うでしょう。

ただし、最大値をロックする必要がある場合は、次のようにすることができます。

start transaction;
select max(SrNo) from cart for update;
/* do some other stuff, insert the max value + 1 etc... */
commit;

覚えておいてください:単一のクエリではない操作にはトランザクションを使用する必要があります!

于 2011-08-10T21:26:30.307 に答える