3

次のように、ユーザーを含む InnoDB テーブルがあります。

+--------------+-----------------------+
| user_id      | name                  |
+--------------+-----------------------+
| 1            | Bob                   |
| 1            | Marry                 |
| 2            | Bob                   |
| 1            | John                  |
| 3            | Bob                   |
| 2            | Marry                 |
+--------------+-----------------------+

挿入ごとに user_id を 1 増やします。たとえば、Bob の次の user_id は 4 になります。

これを行うには、次のクエリを使用します。

INSERT INTO users (user_id, name)
SELECT 1 + coalesce((SELECT max(user_id) FROM users WHERE name='Bob'), 0), 'Bob';

ここで、2 人の異なるユーザーが同時に「Bob」を追加しないようにする必要があります。user_id 4 を持つ 2 つの Bob は必要ありません。Bob のユーザー ID はそれぞれ異なっている必要があります。

上記の挿入クエリを実行すると、ボブのすべての行を書き込みおよび更新してロックすることは可能ですか? 他の多くのユーザーがまだ行へのフル アクセスを必要としているため、テーブル全体をロックできません。また、すべての行が常に読み取り可能である必要があります。どうすればいいですか?

4

3 に答える 3

3

質問の最初の部分を解決するには、user_id と name に一意のインデックスを作成します。

alter table `users` add unique index ak_user_id_name(user_id,name);

これにより、user_id,name レコードの重複が防止されます。

于 2009-10-19T19:49:53.150 に答える
2

ここで InnoDB を想定すると、SELECT ... LOCK IN SHARE MODEを使用して、行を選択したときに行をロックできます。

于 2009-10-19T19:44:19.997 に答える