0

私は正常に動作するコードを持っていますが、代わりに自動インクリメントの ID を挿入したい id=行数 + 1 - mediamall_favourite_media テーブルの

すべての行を削除するときにauto_incrementオプションを設定したので、これをやりたいです。次の行は最後の番号で挿入されます。たとえば、50行を挿入し、それらをすべて削除してから、もう1行挿入すると(テーブルは空ですが)、IDは51になります...

$user =& JFactory::getUser();
    $db2 =& JFactory::getDBO();
    $mediaid = $_POST['addMediaId'];
    //$delid = $_POST['delRow'];


if(isset($_POST['submitCheck']) and $_POST['submitCheck'] == '1') {             
  $query = ' INSERT INTO `#__mediamall_favourite_media` (`id`, `userid`, `mediaid`) VALUES (NULL,"'.$user->id.'","'.$mediaid.'")';
 }    
elseif(isset($_POST['submitCheck']) and $_POST['submitCheck'] == '0') {     
$query = ' DELETE FROM `#__mediamall_favourite_media` WHERE `id` = "'.$delid.'" '; 
}  


if($query) {
   $db2->setQuery($query);
   $db2->query();
}

どうぞ、解決策はありますか?

4

1 に答える 1

1

いいえ、トランザクション データベースではできません。シナリオは次のとおりです。

  • トランザクション A が開始され、max(id) + 1新しい ID (たとえば 101) として取得されます。
  • トランザクション B が開始され、max(id) + 1新しい ID (たとえば 101) として取得されます。
  • トランザクション A がコミットします。
  • トランザクション B がコミットを試みます - ブーム! できません - ID 101 が重複しています。

(代わりにmax(id)+1使用できますcount(*)+1-結果は同じになります)。

穴を再利用しようとしてもうまくいきません:

  • トランザクション A が開始され、id が自動インクリメント (たとえば 101) として取得されます。
  • トランザクション B が開始され、ID が自動インクリメント (たとえば 102) として取得されます。
  • トランザクション B がコミットします。
  • トランザクション A は何らかの奇妙な理由で中止されます (たとえば、クライアントが接続を失ったなど)。これで、id 101 は使用されなくなります。再利用しようとすると、非常に高価になります。

この図をさらに複雑にするために、2 つではなく、同時に 10 個の同時トランザクションが実行されていると想像してみてください。

言い換えれば、これと戦うのをやめて、それに耐えてください.

于 2013-10-26T01:02:27.440 に答える