相关疑难解决方法(0)

使用synchronized关键字的Spring @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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

假设这本书被删除,然后重新添加了一个新作者或其他小改动,所以这个方法可能会从另一个系统快速调用两次,首先删除Book,然后再添加相同的Book(带有一些新的细节) ).

为了解决这个问题,我们可能会尝试(像我一样)添加上面的@Transactional代码,然后在@Transactional不起作用时也"同步".但奇怪的是,它在第​​二次通话中失败了

"无法添加书本已经存在".

我花了很多时间试图解决这个问题,所以我想我会分享答案.

java spring synchronized transactional

7
推荐指数
3
解决办法
6220
查看次数

标签 统计

java ×1

spring ×1

synchronized ×1

transactional ×1