Java 多线程环境中的ACID问题
我有一个多线程java应用程序,它在MySQL数据库上执行许多并行CRUD操作。正如MySQL手册中所述,InnoDB表结构应确保事务按照ACID原则执行。但我仍然有问题,因为有时更新会丢失。这是我使用的示例存储过程之一:Java 多线程环境中的ACID问题,java,mysql,multithreading,innodb,acid,Java,Mysql,Multithreading,Innodb,Acid,我有一个多线程java应用程序,它在MySQL数据库上执行许多并行CRUD操作。正如MySQL手册中所述,InnoDB表结构应确保事务按照ACID原则执行。但我仍然有问题,因为有时更新会丢失。这是我使用的示例存储过程之一: DELIMITER // CREATE PROCEDURE *** ( _*** INT, _*** INT, _*** INT, _*** INT ) BEGIN START TRANSACTION; UPDATE `***`
DELIMITER //
CREATE PROCEDURE *** (
_*** INT,
_*** INT,
_*** INT,
_*** INT
)
BEGIN
START TRANSACTION;
UPDATE `***`
SET
`***`.`***` = `***`.`***` + _***,
`***`.`***` = `***`.`***` + _*** + _***,
`***`.`***` = DATE_ADD(NOW(), INTERVAL _*** SECOND)
WHERE `***`.`***` = _***;
COMMIT;
END;
//
DELIMITER ;
JDBC类是不可重入的,因此您必须同步使用connection、statement等对象实例。多个线程不能同时使用它们 使用连接池是简化对数据库的并发访问的好方法 编辑 如果确定线程从未使用相同的连接,则可以检查
- 池是否可以断开连接?这是怎么处理的
- 是否有两次更新会在第一次被覆盖的同一条记录上运行
- 您是否捕获所有异常并将其记录到您的workers中
- 池是否可以断开连接?这是怎么处理的
- 是否有两次更新会在第一次被覆盖的同一条记录上运行
- 您是否捕获所有异常并将其记录到您的workers中