重複の可能性:
MySQL の行を読み取り専用に設定するには?
テーブルのカスタム行を一時的に保護して、別のユーザーが編集できないようにする必要があります。たとえば、この機能を使用して行を挿入する場合: tid = 51
; 誰にも row 、または少なくとも 1 つの行をtid = 51
同時に挿入させてはなりません。これどうやってするの?
重複の可能性:
MySQL の行を読み取り専用に設定するには?
テーブルのカスタム行を一時的に保護して、別のユーザーが編集できないようにする必要があります。たとえば、この機能を使用して行を挿入する場合: tid = 51
; 誰にも row 、または少なくとも 1 つの行をtid = 51
同時に挿入させてはなりません。これどうやってするの?
あなたが望むことは、データベースが設計されたすべてのものに逆行します。一意の主キーが必要な場合は、自動インクリメント フィールドを使用します。一意のフィールド値を強制する場合は、フィールド制約、おそらく一意のフィールドまたはフィールドの一意の組み合わせを使用します。
テーブル、行、またはデータベースをロックしないでください。ほとんどの場合、これは悪い設計です!
通常、IDは、データベースに挿入された時点でのみ行に割り当てられます。この瞬間より前には存在しません。その後、それはすでに挿入されており、他の誰も同じIDを持つ別の行を挿入することはできません(それが一意にインデックス付けされた列であると仮定します)。
したがって、あなたの例は無効のようです。いずれにせよ、この例を無視して冒頭のフレーズ「テーブルのカスタム行を他のユーザーが編集できないように一時的に保護する必要があります。」
この場合、編集中の ID の値と、どのユーザーが編集したかをどこかに保存する必要があります。次に、このデータをチェックして、編集アクションを許可/禁止する必要があります。
実際、ここでの主な問題は、Web/HTTP アプリケーションのステートレスな性質による UNLOCK フェーズです。編集後または何らかのタイムアウト後に行が適切にロック解除されていない場合、行は (一時的ではなく) 永続的にロックされます。
列 (tid) を MYSQL の AUTO_INCREMENT フィールドとして定義するだけです (または他の DBMS。この機能はほぼすべての場所でサポートされています)。ロックの面倒を見る必要はありません。データベースが自動的にやってくれます。
データベースに行を挿入する前にこのフィールドの値が必要な場合 (これは必ずしも良い設計ではありません)、ランダムに生成された UUID を使用する必要があります。したがって、2 つの同一の値を持つ確率を最小限に抑えることで衝突を回避します。