0

「picks」というテーブルがあり、ユーザーがログインしてピックを開始すると、最初にそのユーザーの「picks」テーブルに64行が挿入されます(列としてユーザーIDがあります)。行はphpのループを使用して挿入されるため、PDOの準備済みステートメントを使用して64の挿入があります。これは、ユーザーごとに 1 回だけ実行する必要があります。そのユーザーに対してこれらの行が連続している必要があります。他の数人のユーザーがまったく同時に同じことをしている場合はどうなりますか? 行が連続して挿入されない可能性はありますか? テーブルロックを使用する必要がありますか? 私は以前にそれらを使用したことがありません。MySql バージョン: 5.0.92-rs-log MyISAM ありがとう

4

2 に答える 2

0

まず第一に、1 人のユーザーに対して ID が連続していることに頼るのではなく、これを解決するためのより良い方法があるはずです。

実際、同時実行性の問題が発生する可能性があります。Oracle などの他の DBMS では、auto_increment の代わりにシーケンスがあり、このタイプの処理に適しています。行が 1 つしかない補助テーブルを使用して、これをエミュレートできます。この場合、ID (または何でも) フィールドは auto_increment に設定されず、sequence最後の ID を保存する (たとえば) という名前のテーブルが作成されます。次に、64 個の新しいレコードを挿入する前に、そのテーブルにクエリを実行して最後の ID を取得し、それを更新します。

次のようなものです (PHP 関数に注意を払う必要はありません。コードをわかりやすくするためです)。

// Get the last ID
$last_id = query('SELECT last_id FROM sequence LIMIT 1');

// Store the last ID in your code and then update the new value
$new_id = $last_id + 64;
query('UPDATE sequence SET last_id = :new_id', array('new_id' => $new_id));

// Make sure your DB class is set on auto_commit or commit the transaction here

// Insert your new records
for ($i = ++$last_id; $i < $new_id; $i++) {
    query('INSERT INTO picks (id, user_id) VALUES (:id, :user_id)', array('id' => $i, 'user_id' => $user_id));
}
于 2012-03-11T03:04:57.457 に答える
0

実際にテーブル ロックを必要としない問題には、テーブル ロックを使用しません。行が連続している必要はありません。たぶん、自動インクリメンタル ID に基づいてそれらを注文していますか? その場合、それらは連続していない可能性がありますが、順番になります。さらに、これらの行に特定の順序が必要な場合は、実際の順序を設定する別の列をいつでも追加できます。

とにかく、質問を拡大して、より適切なヘルプを取得してください。

于 2012-03-11T02:52:26.833 に答える