Dialect/Driver - Every SELECT I perform, add with(nolock)

后端 未结 4 607
猫巷女王i
猫巷女王i 2020-12-18 17:00

I need to know a way to implement in my system, a Driver or Dialect which, whenever I perform a SELECT in Nhibernate, the SELECT adds the with(nolock) with it. I need that t

4条回答
  •  不知归路
    2020-12-18 17:24

    Hope this would help someone, I used this code to add no lock hints to the most of the queries, related to the answer dillenmeister

    public class NoLockHintsInterceptor : EmptyInterceptor
        {
            public override SqlString OnPrepareStatement(SqlString sql)
            {
                // Modify the sql to add hints
                if (sql.StartsWithCaseInsensitive("select"))
                {
                    var parts = new List((object[]) sql.Parts);
                    object fromItem = parts.FirstOrDefault(p => p.ToString().ToLower().Trim().Equals("from"));
                    int fromIndex = fromItem != null ? parts.IndexOf(fromItem) : -1;
                    object whereItem = parts.FirstOrDefault(p => p.ToString().ToLower().Trim().Equals("where"));
                    int whereIndex = whereItem != null ? parts.IndexOf(whereItem) : parts.Count;
    
                    if (fromIndex == -1)
                        return sql;
    
                    parts.Insert(parts.IndexOf(fromItem) + 2, " with(nolock) ");
                    for (int i = fromIndex; i < whereIndex; i++)
                    {
                        if (parts[i - 1].Equals(","))
                        {
                            parts.Insert(i + 2, " with(nolock) ");
                            i += 2;
                        }
                        if (parts[i].ToString().Trim().EndsWith(" on"))
                        {
                            parts[i] = parts[i].ToString().Replace(" on", " with(nolock) on ");
                        }
                    }
                    sql = new SqlString(parts.ToArray());
                }
                return sql;
            }
        }
    
        

    提交回复
    热议问题