多线程环境中的 ACID 问题

发布于 2024-12-15 13:59:07 字数 516 浏览 1 评论 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 ;

I have a multi-threaded java application which executes a lot of parallel CRUD operations on an MySQL Database. As read in MySQL manuals, InnoDB table structure should ensure, that the transactions are executed following the ACID priciples. But I still have problems, because sometimes, the Updates get lost. This is one of the example Stored Procedures that I use:

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

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

  COMMIT;
END;
// 
DELIMITER ;

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

飞烟轻若梦 2024-12-22 13:59:07

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

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

编辑

如果您确定线程从不使用相同的连接,您可以检查

  • 池是否没有连接?这是怎么处理的?
  • 有没有可能两次更新作用于同一条记录,而第一次更新被覆盖?
  • 您是否捕获所有异常并将其记录在您的工作人员中?

The JDBC classes are not reentrant, so you have to synchronise use of object instances of connection, statement, etc. They cannot savely be used by multiple threads concurrently.

Use of a connection pool is a good way to streamline concurrent access to a database.

Edit

If you're sure that the threads never use the same connection, you could check

  • can the pool be out of connections? how is that handled?
  • could it be that 2 updates act on the same record where the first get overwritten?
  • do you catch all exceptions and log them in your workers?
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文