Java 如何使用jdbc读取未提交的数据?

Java 如何使用jdbc读取未提交的数据?,java,jdbc,Java,Jdbc,我想测试JDBC事务是如何工作的。特别是,我希望看到未提交数据的读取。我使用本地安装的PostgreSQL数据库在spring boot环境中编写了一个集成测试 我试图在表中插入一行,从一个事务中读取它,然后在不提交的情况下从另一个事务中更新它,然后再次读取它,希望它会改变 测试表(DDL): 测试: public void testHealthCheck() throws SQLException { Connection zeroConnection = dataSo

我想测试JDBC事务是如何工作的。特别是,我希望看到未提交数据的读取。我使用本地安装的PostgreSQL数据库在spring boot环境中编写了一个集成测试

我试图在表中插入一行,从一个事务中读取它,然后在不提交的情况下从另一个事务中更新它,然后再次读取它,希望它会改变

测试表(DDL):

测试:

    public void testHealthCheck() throws SQLException {
        Connection zeroConnection = dataSource.getConnection();
        Integer insertedUserId = insertUserSilently(zeroConnection, new User()
                .setFirstName("John")
                .setSecondName("Doe")
                .setEmail("johndoe@gmail.com"));
        zeroConnection.close();

        Connection firstConnection = dataSource.getConnection();
        firstConnection.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
        firstConnection.setAutoCommit(false);

        Connection secondConnection = dataSource.getConnection();
        secondConnection.setTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);
        secondConnection.setAutoCommit(false);

        List<User> users = getAllUsersSilently(firstConnection);
        log.info("Got users: {}", silentToJsonString(users));

        PersistenceUtils.updateUserEmailSilently(secondConnection, insertedUserId, "johndoe@yahoo.com");

        users = getAllUsersSilently(firstConnection);
        log.info("Got users: {}", silentToJsonString(users));

        secondConnection.rollback();
        secondConnection.close();

        users = getAllUsersSilently(firstConnection);
        log.info("Got users: {}", silentToJsonString(users));

        firstConnection.close();
    }
获得用户:

[{"id":55,"firstName":"John","secondName":"Doe","email":"johndoe@gmail.com"}]
[{"id":55,"firstName":"John","secondName":"Doe","email":"johndoe@gmail.com"}]
[{"id":55,"firstName":"John","secondName":"Doe","email":"johndoe@gmail.com"}]
获得用户:

[{"id":55,"firstName":"John","secondName":"Doe","email":"johndoe@gmail.com"}]
[{"id":55,"firstName":"John","secondName":"Doe","email":"johndoe@gmail.com"}]
[{"id":55,"firstName":"John","secondName":"Doe","email":"johndoe@gmail.com"}]
虽然第二次读取应该会看到未提交的电子邮件更改。

无法读取Postgres中未提交的数据 请参阅PostgreSQL文档的一节:

在PostgreSQL中,您可以请求四个标准事务隔离级别中的任何一个,但在内部只实现三个不同的隔离级别,即PostgreSQL的读取未提交模式的行为类似于读取已提交的。这是因为这是将标准隔离级别映射到PostgreSQL的多版本并发控制体系结构的唯一合理方法

这意味着,如果要测试
事务\u读取\u未提交
,则需要一个非PostgreSQL的DBMS。

无法读取Postgres中的未提交数据 请参阅PostgreSQL文档的一节:

在PostgreSQL中,您可以请求四个标准事务隔离级别中的任何一个,但在内部只实现三个不同的隔离级别,即PostgreSQL的读取未提交模式的行为类似于读取已提交的。这是因为这是将标准隔离级别映射到PostgreSQL的多版本并发控制体系结构的唯一合理方法


这意味着,如果要测试
事务读取未提交的
,则需要一个非PostgreSQL的DBMS。

@user3880400 From:READ UNCOMMITTED:此级别意味着事务隔离被禁用。如果启用了多线程模式,则PageStore引擎不支持此级别。@user3880400如果要尝试读取未提交,则可能应该尝试SQL Server。@user3880400 From:read uncommitted:此级别表示事务隔离已禁用。如果启用了多线程模式,则PageStore引擎不支持此级别。@user3880400如果要尝试读取未提交,则可能应该尝试SQL Server。