【发布时间】:2014-08-14 22:38:12
【问题描述】:
我想在单个事务范围内打开多个连接,以便每个连接都可以看到前一个连接所做的更改。
我需要这个来进行测试 - 真正的代码写入数据库,测试代码验证数据是否实际插入/更新。最后我回滚事务范围,使真实数据库不受影响。
这种方法在 SQL Server 中运行良好,但在 PostgreSQL 中似乎不起作用(我使用 9.3 和 Npgsql 提供程序),下面是一个小例子。
这是在事务范围内运行任意查询的助手
private void RunQuery(string query, Action<IDataReader> process)
{
using (var connection = new NpgsqlConnection(Config.ConnectionString)) {
connection.Open();
connection.EnlistTransaction(Transaction.Current);
using (var command = connection.CreateCommand()) {
command.CommandText = query;
using (var reader = command.ExecuteReader()) {
while (reader.Read()) {
process(reader);
}
}
}
}
}
..这是测试代码 - 它插入到users 表中,然后检查用户是否实际插入:
using (var scope = new TransactionScope()) {
//"tested scenario"
int id = 0;
RunQuery("INSERT INTO users (name) VALUES ('foo') RETURNING id;", reader => {
id = (int)reader.GetValue(0);
});
//checking
int id2 = 0;
RunQuery("SELECT id, name FROM users WHERE id=" + id, reader => {
id2 = (int)reader.GetValue(0);
});
Assert.That(id2, Is.Not.EqualTo(0));
}
上述测试在 Postgres 上失败,因为 id2 始终为零。我用TransactionOptions.ReadUncommitted 尝试了TransactionScope 构造函数,但它似乎没有帮助。请注意,如果我对 SQL Server 运行此程序(将 NpgsqlConnection 更改为 SqlConection,使用 SCOPE_IDENTITY 检索 id),那么一切正常,id2 不为零。
正如您所料,在 Postgres 的同一连接中进行选择,但我不需要,我的目标是在共享事务范围内使用多个连接。我也不需要多线程,这些连接是按顺序发生的。
【问题讨论】:
标签: c# sql-server postgresql transactions