【发布时间】:2018-03-05 11:10:57
【问题描述】:
我正在使用 MySQL 开发在 WildFly 8 上运行的 EJB 3 应用程序。我需要更新实体 (User) 中的计数器 (receiptCounter),并决定通过存储过程调用尝试它以避免竞争条件。
这就是我创建存储过程的方式:
DELIMITER $$
CREATE PROCEDURE increment_receipt_counter
(
IN userID_in INT
)
BEGIN
UPDATE User SET receiptCounter = receiptCounter + 1 WHERE id = userID_in;
SELECT receiptCounter AS receiptCounter_new FROM User WHERE id = userID_in;
END
$$
DELIMITER ;
我是这样称呼它的:
import javax.persistence.EntityManager;
import javax.persistence.StoredProcedureQuery;
...
public int incrementReceiptsCounter(int userID) throws InvalidEntityException, UnauthorizedException
{
StoredProcedureQuery q = entityManager.createStoredProcedureQuery("increment_receipt_counter");
q.registerStoredProcedureParameter("userID_in", Integer.class, ParameterMode.IN);
q.setParameter("userID_in", userID);
q.executeUpdate();
return (Integer)q.getSingleResult();
}
奇怪的是:当从 Java 调用时,该过程返回正确的新计数器值,但新值并没有被持久化在数据库中。例如,如果在调用过程之前数据库中的receiptCounter为1,Java中的过程调用返回2,但数据库中的User表仍然显示值为1。当我直接从MySQL命令行调用过程时,它工作得很好。我做错了什么?
【问题讨论】:
-
缺少提交?
标签: mysql stored-procedures ejb wildfly