Обновление раздела куба с использованием объекта C # AMO - асинхронный способ - PullRequest
0 голосов
/ 03 мая 2019

Я хочу обновить раздел куба, используя объект C# AMO, синхронный способ обновления раздела происходит нормально. Но я хотел обновить разделы параллельно. Для этого я попытался вызвать метод refresh внутри

Parelle.ForEach().

templatePartition.RequestRefresh(Microsoft.AnalysisServices.Tabular.RefreshType.Full);
database.Model.SaveChanges();

Но выдает ошибку, что:

Не удалось сохранить изменения на сервере. Возвращена ошибка: «Операция блокировки завершилась неудачно из-за тупика.

Поэтому хотелось проверить, что кто-нибудь обновлял раздел, используя вызов AMO асинхронно.

1 Ответ

0 голосов
/ 06 мая 2019

Как упоминал Джероен, правильный способ сделать это - позволить SSAS обрабатывать распараллеливание, чтобы вы не столкнулись с тупиками или другими проблемами, возникающими при обработке разделов в неправильном порядке.

Вы можете использовать свойство CaptureLog для реализации этого в AMO. Журнал записи собирает операторы, которые вы хотите выполнить, а затем ExecuteCaptureLog, чтобы запустить их все. Второй параметр в ExecuteCaptureLog указывает, будут ли процессы выполняться параллельно.

static public XmlaResultCollection RunWithCaptureLog(Server server, string dbName)
{
    if ((svr != null) && (svr.Connected))
    {
        svr.CaptureXml = true;

        #region Actions to be captured to an XMLA file  
        foreach (Table table in server.Databases.GetByName(dbName).Model.Tables)
        {
            foreach (Partition partition in table.Partitions){
                partition.RequestRefresh(Microsoft.AnalysisServices.Tabular.RefreshType.Full);
            }
        }
        #endregion

        svr.CaptureXml = false;

        //public Microsoft.AnalysisServices.XmlaResultCollection ExecuteCaptureLog (bool transactional, bool parallel, bool processAffected)
        return svr.ExecuteCaptureLog(true, true, true);

    }
}
...