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