postgresql - PostgreSQL 咨询锁在事务中不起作用吗?
问题描述
我正在使用带有 Npgsql 驱动程序的 C# 连接到 postgresql 9.6.9。我有两台服务器连接到同一个数据库,循环运行以下初始化代码,以确保它们相互冲突:
using (var txScope = new TransactionScope())
using (var connection = Connection())
{
connection.EnlistTransaction(Transaction.Current);
using (var cmd = new NpgsqlCommand("SELECT pg_advisory_lock(1024)", connection))
using (cmd.ExecuteReader()) { }
// The following line fails:
using (var cmd = new NpgsqlCommand(@"CREATE OR REPLACE FUNCTION update_column()
RETURNS TRIGGER AS $$ BEGIN RETURN NEW; END; $$ language 'plpgsql'; ", connection))
{
cmd.ExecuteNonQuery();
}
using (var cmd = new NpgsqlCommand("SELECT pg_advisory_unlock(1024)", connection))
using (cmd.ExecuteReader()) { }
txScope.Complete();
}
咨询锁应该阻止CREATE
查询当前运行不止一次,但它始终失败,并在创建函数的地方出现“Npgsql.PostgresException (0x80004005): XX000: tuple concurrently updated”。如果我使用LOCK TABLE
而不是咨询锁,它可以工作。如果我在没有交易的情况下这样做,它也可以。但是,每次我想锁定时删除事务似乎是一个脆弱的设计。
注意:我已经用 Npgsql Transactions API 和BEGIN
/尝试过,COMMIT
结果相同。
我认为锁作为互斥锁正常工作,那么事务出了什么问题?
解决方案
推荐阅读
- python - 如何用条件循环数据?
- swift - 如何在 Xcode 中将浮动 UIButton 添加到表视图控制器?
- android - 是否可以找出项目中所有已弃用的功能?
- c# - 在 Xamarin Android 上的哪里存储 NLog 日志文件?
- angular - 从 Angular 8 访问公开的标头
- c - 使用外部函数在任务中获取互斥锁
- javascript - 如何将 ngbDatepicker 日期格式转换为表单的字符串 onSubmit()?
- javascript - Chartjs - 如何在 x 轴标签上获取最后 7 天?
- node.js - Async/Await 不按顺序执行
- javascript - 为什么最大值变量取 d3.max() 值但最小值 d3.min() 不能正常工作?