【发布时间】:2011-11-12 18:53:30
【问题描述】:
我有一个多线程 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 ;
【问题讨论】:
-
对 ACID 中的 I 感到失望。事务的隔离是一个复杂的问题。尝试将事务级别设置为可序列化,以避免对同一行进行并发更新,或者放置一些行锁。
-
@regilero:你应该把它作为答案! Vilius:另请阅读:mpopp.net/2005/12/…
-
我已经阅读了有关事务级别的文章和其他一些文章,但它仍然对我不起作用......我将重新考虑 Java 应用程序的设计,并将 MySQL 服务器更新为5.5 分支。
标签: java mysql multithreading innodb acid