0

MySQLデータベースで多くの並列CRUD操作を実行するマルチスレッドJavaアプリケーションがあります。MySQLのマニュアルで読まれているように、InnoDBテーブル構造は、トランザクションがACIDの原則に従って実行されることを保証する必要があります。しかし、アップデートが失われることがあるため、まだ問題があります。これは、私が使用するストアドプロシージャの例の1つです。

DELIMITER //
CREATE PROCEDURE *** (
    _*** INT,
    _*** INT,
    _*** INT,
    _*** INT
)
BEGIN
  START TRANSACTION;

    UPDATE `***` 
    SET  
      `***`.`***` = `***`.`***` + _***,  
      `***`.`***` = `***`.`***` + _*** + _***,  
      `***`.`***` = DATE_ADD(NOW(), INTERVAL _*** SECOND)  
    WHERE `***`.`***` = _***;

  COMMIT;
END;
// 
DELIMITER ;
4

1 に答える 1

3

JDBC クラスは再入可能ではないため、接続、ステートメントなどのオブジェクト インスタンスの使用を同期する必要があります。複数のスレッドで同時に使用することはできません。

接続プールの使用は、データベースへの同時アクセスを合理化する良い方法です。

編集

スレッドが同じ接続を使用しないことが確実な場合は、確認できます

  • プールが接続されていない可能性はありますか? それはどのように扱われますか?
  • 最初の更新が上書きされる同じレコードに対して 2 つの更新が行われる可能性はありますか?
  • すべての例外をキャッチしてワーカーに記録しますか?
于 2011-11-12T19:32:59.990 に答える