gpt4 book ai didi

c# - 使用回滚的 Postgres、Npgsql 和集成测试

转载 作者:行者123 更新时间:2023-11-29 12:56:53 27 4
gpt4 key购买 nike

在我们的 SQL Server 集成测试中,我们将测试包装在一个 TransactionScope 中,然后我们在每次测试后回滚以保持数据库处于一致状态。

使用 Postgres(或者可能特别是 Npgsql),这似乎是不可能的,因为在单个连接之外的选择无法读取未提交的数据(即使在未提交的事务范围内)。

基本场景简化如下:

[Test]
public void ImplicitEnlist()
{
var connectionString = ConnectionString + ";enlist=true";
using (var scope = new TransactionScope())
{
using (var conn = new NpgsqlConnection(connectionString))
{
conn.Open();
Assert.That(conn.ExecuteNonQuery(@"INSERT INTO data (name) VALUES('test')"), Is.EqualTo(1));
}
using (var conn = new NpgsqlConnection(connectionString))
{
// -> this is false
Assert.That(conn.ExecuteScalar(@"SELECT COUNT(*) FROM data"), Is.EqualTo(1));
}
scope.Rollback();
}
}

谁能分享人们如何使用 Postgres 数据库来解决这个问题?

最佳答案

github issue 中复制粘贴答案:

我真的不认为事情应该按照你想的那样运作。当您在同一个 TransactionScope 中打开两个连接时,您正在执行分布式事务。 PostgreSQL 有 2 个不同的连接,每个连接都有一个 prepared transaction .现在,这并不意味着这两个连接相互了解,或者这两个准备好的事务在某种程度上是相关联的。由于它们尚未提交,事务隔离适用并且每个连接都看不到另一个未提交的更改。

总而言之,分布式事务意味着当您在 TransactionScope 上调用 Complete() 时,将使用两阶段提交协议(protocol)来确保两个事务都提交,或者都不提交。它不保证参与交易以某种方式相互了解。

虽然我很确定事情就是这样运作的,但我不是分布式事务或 PostgreSQL 准备事务方面的专家 - 所以我可能是错的。我将关闭它,但如果您发现任何与我所说的相反的信息,将会重新打开。

关于c# - 使用回滚的 Postgres、Npgsql 和集成测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41023860/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com