2012-03-11 5 views
0

私は 'picks'というテーブルを持っています。ユーザーがログインして選択を開始すると、最初にそのユーザーの「選択」テーブルに64行が挿入されます(ユーザーIDは列) 。行はphpのループを使って挿入されるので、PDOプリペアドステートメントを使って64個の挿入があります。これは、ユーザーごとに1回だけ行う必要があります。 これらの行は、そのユーザーに対して連続する必要があります。何人かの他のユーザーがまったく同じことを同じ時間にやっていたら?行が連続して挿入されない可能性はありますか?テーブルロックを使用する必要がありますか?私は以前はそれらを使ったことがありません。 MySqlバージョン:5.0.92-rs-log MyISAM ありがとうMysqlユーザーごとに連続した行を挿入

+0

...なぜレコードが連続している必要がありますか:この(それは単にコードを分かりやすくするためですが、PHPの機能に注意を払っていない)のような

何か? –

+0

何らかの理由で、連続している必要があるようです。私がこのアプリを書いたとき、私は急いで、おそらくいくつかの悪いコードを書きました。私は、理由を知るために後でいくつかのcadeを書き直さなければならないでしょう。 – EricP

+0

これらの行を取得するためにsqlを送信すると、お手伝いできる場合があります。 –

答えて

0

実際には必要ない問題に対してはテーブルロックを使用しません。行を連続させる必要はありません。オートインクリメンタルIDに基づいてそれらを注文しているのでしょうか?そうであれば、連続していないかもしれないが、順番になるだろう。さらに、これらの行に特定の順序が必要な場合は、常に実際の順序を設定する別の列を追加できます。

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

0

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

実際に並行性の問題が発生する可能性があります。 Oracleのような他のDBMSでは、auto_incrementの代わりにシーケンスがあり、このタイプのものに適しています。あなたは1行だけの補助テーブルを持ってこれをエミュレートすることができます。この場合、ID(または何でも)フィールドはauto_incrementに設定されず、最後のIDを保存するテーブルはsequence(たとえば)となります。次に、64の新しいレコードを挿入する前に、最後のIDを取得して更新するためにそのテーブルをクエリします。私は好奇心が強い

// 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)); 
} 
関連する問題