WildFly不会在MySQL中持久存储过程调用

时间:2017-09-24 10:20:06

标签: mysql stored-procedures ejb wildfly

我正在使用MySQL开发在WildFly 8上运行的EJB 3应用程序。我需要更新实体(receiptCounter)中的计数器(User),并决定尝试使用存储过程调用以避免竞争条件。

这就是我创建存储过程的方式:

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调用时,该过程返回正确的新计数器值,但新值不会持久存储在数据库中。例如,如果在调用过程之前,receiveCounter在DB中为1,则Java中的过程调用返回2,但DB中的User表仍显示值1.当我直接从MySQL命令行调用过程时,它工作得很好。我做错了什么?

1 个答案:

答案 0 :(得分:0)

在mysql命令行中<uses-permission android:name="android.permission.READ_SMS" /> 可能会启用,这意味着您的更新会自动保留。

在java连接中,您可能会禁用auto commit,因此未提交更新,但与auto commit在同一事务中运行的select仍会返回更新的值。

但是,如果要处理并发,那么首先应该有update来锁定计数器,然后更新值。