Скажем, у меня есть класс Java с методом, как это (просто пример)Spring @Transactional с синхронизированной ключевое слово не работает
@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");
}
}
}
Say эта книга становится удалена, а затем снова добавляют новый автор или другие незначительные изменения, поэтому этот метод может быть вызван дважды очень быстро из другой системы, сначала для удаления книги, затем для добавления той же самой книги (с некоторыми новыми деталями).
Чтобы справиться с этим, мы могли бы попробовать (как и я) добавить вышеуказанный код @Transactional, а затем также «синхронизироваться», когда @Transactional не работает. Но странно это терпит неудачу при втором вызове с
«Невозможно добавить книгу уже существует».
Я потратил много времени, пытаясь понять это, поэтому подумал, что я поделюсь ответом.
Если вы хотите изменить детали, обновите его. Вы не удаляете и не добавляете его. Это ужасный дизайн. Если вы все сделаете правильно, вам не понадобится синхронизация. – Kayaman
хорошая попытка захватить upvotes ... почему вы спросили, знаете ли вы уже ответ? – Andrew
Эта проблема не была найдена, потому что я хотел обновить детали книги. Это будет плохой дизайн, как вы говорите. Это просто пример. Есть и другие причины, по которым может возникнуть эта картина, и кто-то другой может поразить эту странную ситуацию так же, как я, поэтому я хотел показать другим, почему это не работает, поэтому им не нужно так долго работать, пытаясь понять как я. – JavaDevSweden