假设我有一个类似这样的方法的java类(只是一个例子)
@Transactional
public synchronized void onRequest(Request request) {
if (request.shouldAddBook()) {
if (database.getByName(request.getBook().getName()) == null) {
database.add(request.getBook());
} else {
throw new Exception("Cannot add book - book already exist");
}
} else if (request.shouldRemoveBook()) {
if (database.getByName(request.getBook().getName()) != null) {
removeBook();
} else {
throw new Exception("Cannot remove book - book doesn't exist");
}
}
}
Run Code Online (Sandbox Code Playgroud)
假设这本书被删除,然后重新添加了一个新作者或其他小改动,所以这个方法可能会从另一个系统快速调用两次,首先删除Book,然后再添加相同的Book(带有一些新的细节) ).
为了解决这个问题,我们可能会尝试(像我一样)添加上面的@Transactional代码,然后在@Transactional不起作用时也"同步".但奇怪的是,它在第二次通话中失败了
"无法添加书本已经存在".
我花了很多时间试图解决这个问题,所以我想我会分享答案.