我有一个多线程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 ;
答案 0 :(得分:3)
JDBC类不可重入,因此您必须同步使用连接,语句等对象实例。它们不能同时由多个线程保存。
使用连接池是简化数据库并发访问的好方法。
修改强>
如果你确定线程永远不会使用相同的连接,你可以检查