0

我有一个多线程 Java 应用程序,它在 MySQL 数据库上执行大量并行 CRUD 操作。如 MySQL 手册中所述,InnoDB 表结构应确保事务按照 ACID 原则执行。但我仍然有问题,因为有时更新会丢失。这是我使用的示例存储过程之一:

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 回答