使用NpgSql设置PostgreSql事务锁

时间:2014-11-20 10:39:27

标签: database postgresql locking postgresql-9.3 npgsql

我有这个应用程序使用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。

  1. 我的假设是否正确?
  2. 将事务锁设置为访问共享会解决吗?
  3. 如果隔离级别ReadUncommited不够用,我怎么能这样做呢?

0 个答案:

没有答案