我正在尝试使用以下代码段创建一个新的空地震集合。
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
}
答案 0 :(得分:2)
不应该在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;
}
}
答案 1 :(得分:1)
您的第一个事务块缺少commit(),这将导致废弃的事务异常,并可能导致您的项目处于不受支持的状态,这反过来可能会导致您的事务锁定异常。
答案 2 :(得分:0)
我刚刚意识到,因为项目中没有地震数据,所以没有地震资源"所以我先创建了一个空的地震项目并且有效。