Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用update语句时的竞争条件_Java_Mysql_Sql_Hibernate_Race Condition - Fatal编程技术网

Java 使用update语句时的竞争条件

Java 使用update语句时的竞争条件,java,mysql,sql,hibernate,race-condition,Java,Mysql,Sql,Hibernate,Race Condition,我有一个使用hibernate的update语句,它将计数增加一个值。我使用的语句是 UPDATE_STMT="UPDATE STATS.PROCESSED SET COUNT = COUNT + ? WHERE ID = ?" 我正在准备语句并以这种方式执行它。以下所有代码都处于事务/提交/回滚模式下 update = session.connection().prepareStatement(UPDATE_STMT); update.setLong(1, data.getCounter()

我有一个使用hibernate的update语句,它将计数增加一个值。我使用的语句是

UPDATE_STMT="UPDATE STATS.PROCESSED SET COUNT = COUNT + ? WHERE ID = ?"
我正在准备语句并以这种方式执行它。以下所有代码都处于
事务/提交/回滚模式下

update = session.connection().prepareStatement(UPDATE_STMT);
update.setLong(1, data.getCounter());
update.setLong(2, data.TransId());
update.execute();
但是看起来有竞争条件,数据库没有被正确更新。正在从多个应用程序服务器执行更新。我想知道使用上面的语句进行更新是否是一种安全的方法,或者是否有更好的方法来处理这种情况。

您说的“未正确更新”是什么意思?该语句将向指定的列添加1,因为SQL(至少是DB2)在更新期间临时锁定行。最好的办法是找出为什么有多台服务器调用此语句——这本身就是一个问题。否则,基于值的乐观锁定可能会起作用。所谓“未正确更新”,我的意思是计数不符合预期,这表明在更新或选择更新时存在某种竞争条件。多个服务器运行相同的处理代码,并从其末端更新计数,因此
COUNT=COUNT+?
。感谢乐观锁定上的指针,有没有标准的方法在没有竞争条件的情况下执行这样的更新。您最大的问题是您在多个服务器上运行相同的语句,并且不期望得到结果。根据您执行此操作的原因,您可能会导致db服务器执行超出其需要的工作。如果执行乐观锁定,可能需要在Java中引发异常,这意味着应用程序服务器将执行额外的工作。这句话本身很好——如果这是一个问题,你的应用程序可能有问题;例如,
data.getCounter()
来自什么?如果由于此原因而多次运行更新。。。