Java 同步关键字似乎不起作用



我的要求是从数据库中的表中提取代码,并将其标记为已删除,这样就不会再提取代码了。我们注意到两次相同的代码被提取。因此,我同步了如下方法:

public synchronized String fetchCode(School school) {
log.info("fetching code for school id : {}", school.getId());
//DB query to fetch the code (For a certain school id, there can be many codes and we need to use one at a time and delete it)
log.info("fetched code : {}", code);
//DB query to mark the code as deleted
return code;
}

在调试时,我注意到日志会连续打印第一个日志两次,然后再打印第二个日志。两个日志中的代码都是相同的。所以,synchronized关键字似乎没有任何好处。有什么想法吗?

我不会触及其中的Kafka部分,因为尽管该项目在流媒体方面所产生的效果可能很好,但同步必须完成,而且同步从来都不是一件容易的事——无论并行化恋物癖者试图向你推销什么。

如果您想正确地执行此操作,请将信号量锁定移动到尽可能靠近数据的位置。从数据库中提取要标记为已删除的记录时,请使用for update限定符。这将锁定DBMS中的这些记录,并阻止任何其他进程对这些记录发出select...for update。它还将阻止在这些记录上发布updatedelete的任何其他进程。

select上指定锁的文档和示例可以在PostgreSQL文档中找到。

相关内容

最新更新