フィールド ID sn (会員番号) を持つデータテーブル mem があります。たとえば、会員番号は 03117777777、03100005555、03100005556 というデータがあることがわかります。sn は 11 桁ですが、データはsn は連続または不連続のいずれかで、最初に入力することができます。要件を変更した後、元のデータを変更することはできません。会員が登録されるたびに会員番号が生成され、会員に配布されるため、複数のクエリが同時に発生するという問題もあります。何か良い解決策があれば教えてください
まず、すべてより大きいものを見つけてください。
たとえば、現在の最大値が 03100005556 の場合、次の値は 03100010000 となり、その差は無視されます。
その後、新しいユーザーを追加するたびに、パスワードとして 03100010000+id を使用します。
たとえば、新しいユーザーが id=5678 を使用する場合、ユーザー名は 03100015678 になります
新しいユーザーが最初に ID を挿入し、ID を取得した後に SN を更新すると、競合を回避できます。したがって、主題を使用する唯一の選択肢があります。
まず、すべての ??? よりも大きいはずの ??? を見つけます。
たとえば、現在の最大値が 03100005556 の場合、次の値は 03100010000 となり、その差は無視されます。
その後、新しいユーザーを追加するたびに、パスワードとして 03100010000+id を使用します。
たとえば、新しいユーザーが id=5678 を使用する場合、ユーザー名は 03100015678 になります
新しいユーザーが最初に ID を挿入し、ID を取得した後に SN を更新すると、競合を回避できます。したがって、主題を使用する唯一の選択肢があります。
1. すべての ID を取り出し、最大の ID を取得します。後から追加されるデータは最大値の後に追加されます。
2. 同時ユーザー登録、データは memcache または redis を通じてキャッシュに書き込むことができます。
あなたは fdipzone のアルゴリズムを完全には理解していません
彼の言いたいことは次のとおりです:
id と sn の 2 つの列があり、id は自動増加します。
max(sn) = 03109999999 の場合
次に、定数 n = max(sn) - max(id) があります
n + (max(id)+1) = max(sn) = 03110000000
このように、前回の混乱から明らかになります、もちろん、これにはかなりの量の SN リソースが不足する必要があります
したがって、次のアルゴリズムを使用してリーク埋め込み操作を完了することもできます
select a.sn, b.sn as bsn from table a left join table b on a.sn+ 1 =b.sn bsn は null 制限 1
このようにして不連続な SN を見つけます
sn + 1 は挿入されるべき SN です
SN に一意のインデックスを構築して試してみてください挿入が失敗した場合も、同時実行の問題を解決できます
テーブル内の SN の間隔がすべていっぱいになったら、dipzone アルゴリズムを使用します (結局のところ、データベースの計算量ははるかに少なくなります)
皆さん、ありがとうございましたあなたの熱心な答え、私はそれを理解しています。基礎があまり良くないので、ゆっくり理解する必要があります。