Разработка
13
Окт
2

No Lock Property

У класс QueryExpression есть свойство по “NoLock”. При его установки в true, система не ставить блокировки в отношении объектов, которые участвуют в Ваших запросах. Что в свою очередь увеличивает параллелизм и производительность, потому что механизм базы данных не должен включать s-блокировки (shared locks). Обратная сторона медали — может осуществляться “грязное” чтение. «Грязное» чтение — это когда считаны данные из другой, не завершенной транзации. И если другая транзация откатится, получится что мы считали не верные данные. Особо высок риск «грязного» чтения в БД с большим количеством транзакций.

using System;
using System.Collections.Generic;
using System.Text;

using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Query;
using Microsoft.Xrm.Sdk.Client;

using System.ServiceModel;
using System.ServiceModel.Description;
using System.Runtime.Serialization;

namespace NoLock
{
    class Program
    {
        static void Main(string[] args)
        {
            // Подключаемся к CRM
            ClientCredentials credentials = new ClientCredentials();
            credentials.Windows.ClientCredential = new System.Net.NetworkCredential("Administrator", "1qaz@WSX", "D2011");
            Uri uri = new Uri("http://win-ebu0m4kvf06/superfirma/XRMServices/2011/Organization.svc");
            OrganizationServiceProxy proxy = new OrganizationServiceProxy(uri, null, credentials, null);
            proxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
            IOrganizationService service = (IOrganizationService)proxy;
            
            QueryExpression query = new QueryExpression
            {
                NoLock = true,
                EntityName = "account",
                ColumnSet = new ColumnSet("name"),
                Criteria = new FilterExpression
                {
                    Conditions =
                      {
                           new ConditionExpression
                           {
                                AttributeName = "statecode",
                                Operator = ConditionOperator.Equal,
                                Values = {0}
                           },
                           new ConditionExpression
                           {
                                AttributeName = "accountid",
                                Operator = ConditionOperator.Equal,
                                Values = {new Guid("ABC7A0D8-EAEB-E211-93ED-000C29461FAD")}
                            }
                       }
                }
            };

            EntityCollection response = service.RetrieveMultiple(query);
        }
    }
}


Комментарии (2)
  • Павел 13.10.2013

    Прикольно:), спасибо за подсказку, я никогда не обращал на него внимание, хотя в сикввели часто юзаю

  • MichaelG 13.10.2013

    Спасибо, но у меня везде FetchXMLпрописан, вот может кому надо — добавляет NoLock к FetchXML.

    public string AddNoLock(string FetchXML)
    {
    XmlDocument fetch = new XmlDocument();
    fetch.LoadXml(FetchXML);
    XmlNode root = fetch.SelectSingleNode(«fetch»);
    if (root.Attributes[«no-lock»] == null)
    {
    XmlAttribute NoLockAttr = fetch.CreateAttribute(«no-lock»);
    NoLockAttr.Value = «true»;
    root.Attributes.Append(NoLockAttr);
    }
    return fetch.OuterXml;
    }

*

code