具有同步关键字的春季@Transactional不起作用
假设我有一个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");
}
}
}
假设这本书被删除了,然后用新的作者或其他微小的更改重新添加,所以这种方法可能会从另一个系统快速调用两次,首先是删除这本书,然后添加回同一本书(有一些新的细节)。
为了解决这个问题,我们可以尝试(就像我一样)添加上面的@Transactional代码,然后在@Transactional不起作用时“同步”。但奇怪的是,它在第二次通话中失败了。
“无法添加书籍 - 书籍已存在”。
我花了很多时间试图弄清楚这个问题,所以我想我会分享答案。