Java 如何在数据库级别实现线程安全计数器?

Java 如何在数据库级别实现线程安全计数器?,java,database,multithreading,jpa,Java,Database,Multithreading,Jpa,我有一个名为“stats”的表,其中只有一行用于统计。我想在注册新产品时更新此表的“totalProductCount”列。(注册新产品时将totalProductCount增加1) 问题是我的应用程序的寄存器模块是多线程的,我认为当我从不同的线程调用这个方法时,会出现争用情况。有没有办法增加不同线程的列值 public void increaseProductCount(long reqId) { EntityManager em = emf.createEntityManager()

我有一个名为“stats”的表,其中只有一行用于统计。我想在注册新产品时更新此表的“totalProductCount”列。(注册新产品时将totalProductCount增加1)

问题是我的应用程序的寄存器模块是多线程的,我认为当我从不同的线程调用这个方法时,会出现争用情况。有没有办法增加不同线程的列值

public void increaseProductCount(long reqId) {
    EntityManager em = emf.createEntityManager();
    EntityTransaction transaction = em.getTransaction();
    transaction.begin();

    Query query = em.createNativeQuery("update stats set total_product_count = total_product_count + 1 where id = 1");
    query.executeUpdate();

    transaction.commit();
}

您是否实际遇到过竞争条件的实例


所有
UPDATE
语句都是原子语句,并对更新的数据获取写锁。只要您至少使用了
readcommitted
隔离级别(不建议您这样做),您就应该可以了。

此代码和多线程存在哪些问题?在10个并发线程之后,该值将相同,因为数据库将(取决于您的设置)使它们等待,直到提交以前的更新。您的产品注册也是该数据库的一部分吗?如果不是,并且您要查找的只是一个数据库计数器,那么您可能需要查看序列对象。