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