【问题标题】:JDBC: safe row update when multiple requestsJDBC:多个请求时的安全行更新
【发布时间】:2017-09-01 11:47:48
【问题描述】:

我有一个 Java RESTful API,它使用 JDBC 和 ComboPooledDataSource 进行连接池 (http://www.mchange.com/projects/c3p0/),以及一个通过递增字段来更新行的 PreparedStatement:

public void update(int messageId) {

    String UPDATE_STM = "UPDATE table SET count_field = count_field +1 WHERE id=?";
    conn = ConnectionManager.getConnection();
    PreparedStatement stm = conn.prepareStatement(UPDATE_STM );
    stm.setInt(1, messageId);
    stm.executeUpdate();
}

(我省略了 try/catch,ConnectionManager.getConnection() 为我提供了池中可用的连接之一)。 如果我的 RESTful 服务同时收到两个或多个 update() 方法请求,我是否允许正确更新计数? 如果不是,我应该如何修改代码以避免错误的计数更新?

【问题讨论】:

  • 将此类设为单例并将同步添加到方法声明中。但是增量值的最佳解决方案是使用数据库构建工具,如序列

标签: java mysql jdbc


【解决方案1】:

使用 InnoDB

据我所知,您的 Java 代码是线程安全的,它不会访问或更改任何字段。您只需要担心数据库端的 UPDATE 操作。我假设您使用的是 MySQL,因为您已使用 mysql 标签标记了该问题。 MySql DBMS 提供 ACID 模型,您需要将数据库引擎设置为InnoDB 才能工作。有关详细信息,请参阅此link

【讨论】:

  • 在我将 db engine 设置为 InnoDB 之后,我应该如何修改我的 java 代码让它工作?
猜你喜欢
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
  • 2018-06-17
  • 1970-01-01
  • 1970-01-01
  • 2019-11-25
  • 1970-01-01
  • 2019-05-22
相关资源
最近更新 更多