ホームページ  >  記事  >  バックエンド開発  >  データベースに同時に書き込むときに一意性を維持するにはどうすればよいですか?

データベースに同時に書き込むときに一意性を維持するにはどうすればよいですか?

WBOY
WBOYオリジナル
2016-06-23 13:59:211267ブラウズ


//a,b两个请求并发  注册相同用户名 username='myname'$is_user = "SELECT username FROM users WHERE username='myname'";if(!$is_user){	echo ("INSERT INTO users (username) VALUES ('myname')");}


テーブル内のフィールドに一意のインデックスが設定されていない場合、プログラム内で一意性を制御するにはどうすればよいですか?
a、b が同時にテーブルにクエリを実行すると、結果が登録されるため、両方とも実行されます。挿入しますが、ユーザー名は同じなので、データは唯一のものではありません。これは事実ですか?また、それを回避するにはどうすればよいですか?


ディスカッションへの返信(解決策)

データベース ロック操作

データベース ロック操作
読み取りロックが共有されているようで、全員が同時に読み取ることができるため、エラー結果が発生しました。

一意のキーを追加してみませんか?

最も簡単な方法は、一意のキーをデータベースに追加することです

もう少し複雑です:
単一の Web マシンがローカル ファイル ロック flock、1 つのユーザー名、1 つのローカル ファイルを使用します
複数のマシンが memcache inc を使用してロック メカニズムを実装しますhttp://ju.outofmemory.cn/entry/48924

わかりました、ありがとうございます。

一意のインデックスではない場合にこの問題を解決する方法を時々考えるだけでした。

最も簡単な方法は、一意のキーをデータベースに追加することです

もう少し複雑です:
単一の Web マシンがローカル ファイル ロック flock、1 つのユーザー名、1 つのローカル ファイルを使用します
複数のマシンが memcache inc を使用してロック メカニズムを実装しますhttp://ju.outofmemory.cn/entry/48924
memcache についてもう一度質問します。

$v = $memcache->get ( $key );
if ($v === false) {
$memcache->set ( $key, 0 ) }
$index = $memcache- >increment ($key, 1);

2 つの同時リクエスト a と b get($key) は、set($key) と b set($key) によって上書きされますか?後者

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。