5

私はこれが以前に尋ねられたことを知っていますが、私はまだ混乱していて、可能であればプログラミングに入る前に問題を避けたいと思っています。

常に少なくとも100人のユーザーがアクティブな内部Webサイトを作成する予定です。ユーザーはアイテムを投稿し(値として0を使用してdbに挿入)、そのアイテムはphpサイト(dbクエリ)を介して表示されます。次に、ユーザーはボタンを押してそのアイテムを自分のものとしてロックするオプションを取得します(そのアイテムの値を自分のIDとして割り当てます)

2人以上のユーザーが同時に同じアイテムを取得しないようにするにはどうすればよいですか。私はC++のようなプログラミングでは、プレーンなolミューテックスロックを使用することを知っています。それらはmysqlで同等であり、そのような1つのアイテムエントリのみをロックしますか?LOCK_TABLESやGET_LOCKなどの参照を見たことがあるので、何が最善かについてはまだ非常に混乱しています。

多くの人がその1つのボタンを押す可能性があり、複数の人が確認を得ると悲惨なことになります。

これが競合状態の代表的な例であることは知っていますが、mysqlは私にとって外国の領土です。

明らかに、アイテムを更新する前にアイテムの値を照会し、アイテムが書き込まれていないことを確認しますが、この競合状態を回避するための最良の方法は何ですか。

前もって感謝します。

4

3 に答える 3

2

これを実現するには、何らかの方法でレコードをロックする必要があります。列 LockedBy を追加し、デフォルトで 0 に設定します。

誰かがボタンを押すと、次のようなクエリが実行されます。

UPDATE テーブル SET LockedBy= WHERE LockedBy=0 and id=;

更新後、影響を受ける行を確認します (php mysql_affected_rows で)。値が 0 の場合、LockedBy 列が 0 ではなく、他のユーザーによってロックされているため、クエリが何も更新しなかったことを意味します。

お役に立てれば

于 2013-07-16T21:32:35.190 に答える