我有这个应用程序使用NpgSql 2.2.0对PostgreSql 9.3执行一些(2到10之间)并发select-only请求,并且大部分时间中至少有2个超时。
当我在执行期间检查锁时,我可以看到每个请求都有一个ACCESS SHARE锁,但是在一个具有EXCLUSIVE锁的事务中。我认为超时是因为所有请求大约同时被触发,后者无法在适当的时候获得EXCLUSIVE锁。
我尝试使用显式事务并将隔离级别设置为ReadUncommitted,但这不会改变任何内容。这是我使用的模式:
using (var con = new NpgsqlConnection(Configuration.B2bConnectionString))
{
NpgsqlCommand cmd = new NpgsqlCommand(string.Format(@"SELECT shop_id, ean, brand, label1, label2, containing, image_url, cc.cat_key, cc.cat1, cc.cat2, cc.cat3, cc.cat_string
FROM b2b_data.cms_catalog_products_candidates cpc
JOIN b2b_data.cms_catalog_categories cc ON cc.cat_key = cpc.cat_key
WHERE etat IN ('5','6','61') AND ean IN ({0})", string.Join(",", eans.Select(x => string.Format("'{0}'", x))))
, con);
con.Open();
using (var t = con.BeginTransaction(IsolationLevel.ReadUncommitted))
{
using (NpgsqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
//buid object, add it to list
}
}
t.Commit();
}
}
更新 我使用Wireshark来监控发送给DB的内容。我可以看到每个事务的READ COMMITTED隔离级别,但是在发送到服务器的任何数据包的有效负载中都没有出现“LOCK”。这让我认为这个锁定问题来自服务器本身而不是Npgsql驱动程序。对于它的价值,它是亚马逊RDS。