多线程环境中的ACID问题

时间:2011-11-12 18:53:31

标签: java mysql multithreading innodb acid

我有一个多线程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 ;

1 个答案:

答案 0 :(得分:3)

JDBC类不可重入,因此您必须同步使用连接,语句等对象实例。它们不能同时由多个线程保存。

使用连接池是简化数据库并发访问的好方法。

修改

如果你确定线程永远不会使用相同的连接,你可以检查

  • 游泳池可以没有连接吗?怎么处理?
  • 可能是2次更新对第一次被覆盖的同一记录起作用吗?
  • 你是否抓住所有例外并将其记录在你的工人中?