【问题标题】:@Transactional isolation level seems to be not working@Transactional 隔离级别似乎不起作用
【发布时间】:2021-01-31 15:15:42
【问题描述】:

我有一些关于 @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 的事务隔离。

【问题讨论】:

  • 如果您在数据库客户端(psql、mysql 等)中以相同的顺序运行相同的查询,您会收到任何错误吗?我感觉您可能遗漏了一些关于实际数据库引擎如何处理事务的信息。

标签: spring-boot spring-transactions isolation-level


【解决方案1】:

如果您使用@Transactional 注释,那么为了确保在 db 中发生提交,请使用另外一个注释,因为 @EnableTransactionManagement 还包括以下代码

connection.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);

更多详情请关注link

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 2019-03-09
    • 2021-01-02
    • 2013-09-06
    • 2020-08-18
    • 1970-01-01
    相关资源
    最近更新 更多