繁体   English   中英

多线程环境中的ACID问题

[英]ACID Problems in a Multithreaded Environment

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

JDBC类不是可重入的,因此您必须同步使用连接,语句等对象实例。它们无法节省地同时由多个线程使用。

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

编辑

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

  • 池会断开连接吗? 如何处理?
  • 可能有2个更新作用于第一个被覆盖的同一记录吗?
  • 您是否捕获所有异常并将其记录在您的工作人员中?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM