3

プロジェクトの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つの異なるバッチに与えることができないようにすることはできますか?

4

2 に答える 2

3

アトミック操作またはトランザクションを調べてください。データベースをロックし、任意のインスタンスで 1 つの書き込みクエリのみを許可します。

他のユーザーがデータベースのロックが解除されるのを待たなければならないため、これはパフォーマンスに影響を与える可能性があります。

ただし、ADODB がアトミシティに対してどのようなサポートを提供しているかはわかりません。

基本的なコンセプトは次のとおりです。

Acquire Lock
Read from DB
Write to DB with new ID
Release Lock

ロックが既に取得されている場合、スクリプトは再び解放されるまでブロックされます (ビジー待機)。ただし、この方法では、データの危険が発生しないことが保証されます。

于 2012-06-30T20:21:10.577 に答える
-2

トランザクションの開始 更新の選択 コミット

こうすることで、更新ロックにより、2 つの同時実行で同じ値がプルされるのを防ぐことができます。

最初に選択すると、共有ロックは 2 つを分離しません

于 2013-02-09T02:28:46.060 に答える