Создать новую сейсмическую коллекцию Ocean framework

Я пытаюсь создать новую пустую коллекцию сейсмических данных со следующим фрагментом кода.

Collection создается и добавляется на панель ввода, но попытка создать NewSeismicCollection вызывает

Надстройка вызвала ошибку: Slb.Ocean.Core.TransactionLockException; Сбой блокировки транзакции.

if(seismicProj.SeismicCollectionCount == 0)
{
    PetrelLogger.InfoOutputWindow("No seismic collections in current project");
    using (ITransaction trans2 = DataManager.NewTransaction())
    {
        trans2.Lock(proj);
        Collection col2 = proj.CreateCollection("Collection"); 
    }

    using (ITransaction txn = DataManager.NewTransaction())
    {
        try
        {
            txn.Lock(seismicProj);
            SeismicCollection seisColl = seismicProj.CreateSeismicCollection(
                "NewSeismicCollection");
        }
        catch (InvalidOperationException e)
        {
            PetrelLogger.InfoOutputWindow(e.Message);
        }
        finally
        {
            txn.Commit();
        }
    }
}
else
{
    // do something else
}

person Ghetz    schedule 30.04.2015    source источник


Ответы (3)


Разве это не должно быть в одной транзакции, которую вы фиксируете в блоке try, например:

using (ITransaction txn = DataManager.NewTransaction())
{
    try
    {
        txn.Lock(proj);
        Collection col2 = proj.CreateCollection("Collection"); 
        txn.Lock(seismicProj);
        SeismicCollection seisColl = seismicProj.CreateSeismicCollection("NewSeismicCollection");
        txn.Commit();
    }
    catch (Exception e)
    {
        PetrelLogger.InfoOutputWindow(e.Message);
        throw;
    }
}

Или чтобы выяснить ошибку: попробуйте как две отдельные транзакции:

using (ITransaction txn = DataManager.NewTransaction())
{
    try
    {
        txn.Lock(proj);
        Collection col2 = proj.CreateCollection("Collection"); 
        txn.Commit();
    }
    catch (Exception e)
    {
        PetrelLogger.InfoOutputWindow(e.Message);
        throw;
    }
}

using (ITransaction txn = DataManager.NewTransaction())
{
    try
    {
        txn.Lock(seismicProj);
        SeismicCollection seisColl = seismicProj.CreateSeismicCollection("NewSeismicCollection");
        txn.Commit();
    }
    catch (Exception e)
    {
        PetrelLogger.InfoOutputWindow(e.Message);
        throw;
    }
}
person Alex    schedule 30.04.2015
comment
Большое спасибо Алексу и Марсело. Я попробовал оба ваших предложения, но все еще получаю ошибку блокировки транзакции. - person Ghetz; 01.05.2015
comment
Когда (то есть в какой строке в приведенном выше блоке кода) вы получаете это исключение и каково его сообщение? - person Alex; 01.05.2015
comment
Спасибо, Алекс. Из файла OceanPetrelException.log исключение находится в строке 7 приведенного выше фрагмента кода (txn.Lock(seismicProj);). Таким образом, транзакция не может заблокировать сейсмический проект. Это потому, что для буревестника без сейсмических данных нет сейсмического проекта? - person Ghetz; 01.05.2015
comment
Что такое сообщение об исключении? Ваш seismicProj имеет значение null? Если нет, вы можете попробовать разделить это на две транзакции: одну в коллекции proj, а вторую в коллекции seismicProj (см. мое редактирование). - person Alex; 01.05.2015

В первом блоке транзакции отсутствует commit(), это приведет к исключению заброшенной транзакции и может привести к тому, что ваш проект окажется в неподдерживаемом состоянии, что, в свою очередь, может вызвать исключение блокировки транзакции.

person Marcelo Bezerra    schedule 30.04.2015

Я только что понял, потому что в проекте не было сейсмических данных, не было «seismicProj», поэтому я сначала создал пустой сейсмический проект, и он заработал.

person Ghetz    schedule 01.05.2015