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