java - 多线程环境中的 ACID 问题

标签 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 ;

最佳答案

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

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

编辑

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

  • 池可能会失去连接吗?这是如何处理的?
  • 是否有可能两次更新作用于同一条记录,而第一次更新被覆盖?
  • 您是否捕获所有异常并将其记录在您的工作线程中?

关于java - 多线程环境中的 ACID 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8106734/

相关文章:

sql - MySQL MyISAM 表锁定

multithreading - 具有更改优先级功能的优先级队列,它使元素保持有序

java - java中的synchronized关键字是如何发挥作用的?

c++ - 由多个线程访问的队列的推荐模式......工作线程应该做什么?

java - 一个哈希表作为另一个哈希表的值(value)值得推荐吗?

java - 使用java将字符串转换为json对象

java - 对集合进行排序并将内容分配给java中的列表

java - Primefaces p :dataTable showing without message "No records found."?

php - 我想使用 PHP 7.1.5 从 MySql 数据库中获取任何特定字段,但它不起作用

mysql - 如何选择 SQL 数据库表中的第 n 行?