@事务隔离级别似乎不起作用

问题描述

我对@Transactional(也称为spring-tx)有疑问。

在这样的代码中。

@Transactional(propagation = Propagation.REQUIRES_NEW,isolation = Isolation.SERIALIZABLE)
public TestObject testTransaction(Long id,String name,String content) {
    //This is find
    TestObject testObject = testObjectRepository.findById(id).orElse(null);

    if (testObject != null) {
        System.out.println(testObject.getId() + "/"
                + testObject.getName() + "/"
                + testObject.getContent());
    }

    // update something
    testObject.changeContent(name,content);
    slowQuery();
    //delay for late
    return testObject;
}

如果我使用邮递员请求类似的内容。

第一个请求是http://localhost:8080/spring/test/transaction?id=1&name=123&content=123
第二个请求是http://localhost:8080/spring/test/transaction?id=1&name=456&content=456

然后我想,第一个请求挂在事务上,然后第二个请求必须被Spring-tx拒绝,因为第一个请求事务的隔离级别为SERIALIZABLE,并且事务工作未完成。

但是两个请求的结果是

{
  "name":"456","content":"456"
}

有人知道事务隔离吗,我将mysql与docker结合使用,而且spring-data-jpa也是如此。

解决方法

如果您使用@Transactional批注,则要确保在db中进行了提交,请再使用一个批注,因为@EnableTransactionManagement还包括以下代码

connection.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);

有关相同内容的更多详细信息,请遵循此link

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...