我有一个多线程的Java应用程序,它在MySQL数据库上执行大量的并行CRUD操作。如MySQL手册中所读,InnoDB表结构应该确保事务按照ACID原则执行。但是我仍然有问题,因为有时更新会丢失。这是我使用的示例存储过程中的一个:多线程环境中的ACID问题
DELIMITER //
CREATE PROCEDURE *** (
_*** INT,
_*** INT,
_*** INT,
_*** INT
)
BEGIN
START TRANSACTION;
UPDATE `***`
SET
`***`.`***` = `***`.`***` + _***,
`***`.`***` = `***`.`***` + _*** + _***,
`***`.`***` = DATE_ADD(NOW(), INTERVAL _*** SECOND)
WHERE `***`.`***` = _***;
COMMIT;
END;
//
DELIMITER ;
在ACID中的I的bewate。交易隔离是一个复杂的问题。尝试将事务级别设置为可串行化以避免同一行上的并发更新,或者放置一些行锁。 – regilero
@regilero:你应该把它作为答案! Vilius:也请阅读:http://www.mpopp.net/2005/12/tx-isolation-levels-3-repeatable-read-serializable/ –
我已经阅读了关于交易级别的文章和一些其他文章,但仍然不适合我...我将重新考虑Java应用程序的设计,并将MySQL服务器更新到5.5分支。 – Vilius