プロジェクトの1つでbatchIdを使用する必要があります。1つ以上の行に単一のbatchIdを含めることができます。したがって、1人のユーザーから1000行の束を挿入する場合は、この1000行に1つのbatchIdを指定します。このbatchIdは、次の自動インクリメントbatchIdです。
現在、unique_ids用に別のデータベーステーブルを維持し、最後のbatchIdをそこに保存しています。テーブルに行のバッチを挿入する必要があるときはいつでも、unique_idsテーブルのbatchIdを1ずつ更新し、それをバッチ挿入に使用します。
update unique_ids set nextId = nextId + 1 where `key` = 'batchId';
select nextId from unique_ids where `key` = 'batchId';
上記の2つのクエリを起動する関数を呼び出し、バッチのnextId(batchId)を返します。
これが私のPHPクラスと同じものの関数呼び出しです。私はADODBを使用しています。そのADODB関連のコードは無視してかまいません。
class UniqueId
{
static public $db;
public function __construct()
{
}
static public function getNextId()
{
self::$db = getDBInstance();
$updUniqueIds = "Update unique_ids set nextId = nextId + 1 where `key` = 'batchId'";
self::$db->EXECUTE($updUniqueIds);
$selUniqueId = "Select nextId from unique_ids where `key` = 'batchId'";
$resUniqueId = self::$db->EXECUTE($selUniqueId);
return $resUniqueId->fields['nextId'];
}
}
次のbatchIdが必要なときはいつでも、以下のコード行を呼び出すだけです。
`$batchId = UniqueId::getNextId();`
しかし、本当の問題は、1秒間に何百もの同時リクエストがある場合、2つの異なるバッチに同じbatchIdを与えることです。それは私にとって深刻な問題です。私はそれを解決する必要があります。
どうしたらいいか教えてください。このクラスの単一のインスタンスのみを制限して、同時にこの関数を呼び出すことができず、単一のbatchIdを2つの異なるバッチに与えることができないようにすることはできますか?