我写了一个类来帮助使用Core Service添加和删除发布目标。通过Core Service,通常将发布目标暴露为一个字符串(包含XML内容),因此我编写了自己的包装器等。
现在我遇到一个情况,需要更新两个发布目标,并想使用事务范围来确保同时更新这两个目标。但是,我在实现这一点时遇到了困难。
以下是可行的代码(使用标准的CoreService WCF客户端):
执行此代码将成功撤消我所做的更改(如果在
现在,如果我尝试在事务中使用我的“扩展发布目标”类,我无法处理它。
现在我遇到一个情况,需要更新两个发布目标,并想使用事务范围来确保同时更新这两个目标。但是,我在实现这一点时遇到了困难。
以下是可行的代码(使用标准的CoreService WCF客户端):
TransactionOptions txOptions = new TransactionOptions
{ IsolationLevel = IsolationLevel.ReadCommitted };
using(TransactionScope scope = new TransactionScope(
TransactionScopeOption.Required, txOptions))
{
PublicationTargetData publicationTarget1 = (PublicationTargetData)client.Read("tcm:0-1-65537", readOptions);
PublicationTargetData publicationTarget2 = (PublicationTargetData)client.Read("tcm:0-2-65537", readOptions);
publicationTarget1.TargetLanguage = "JSP";
publicationTarget2.TargetLanguage = "JSP";
client.Save(publicationTarget1, readOptions);
client.Save(publicationTarget2, readOptions);
// Stop saving
scope.Dispose();
}
执行此代码将成功撤消我所做的更改(如果在
scope.Dispose()
之前中断并在Tridion中检查发布目标,则会成功更改目标,然后“撤消”更改)。现在,如果我尝试在事务中使用我的“扩展发布目标”类,我无法处理它。
TransactionOptions options = new TransactionOptions { IsolationLevel = IsolationLevel.ReadCommitted };
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, options))
{
ExtendedPublicationTarget target1 = new ExtendedPublicationTarget("tcm:0-1-65537");
ExtendedPublicationTarget target2 = new ExtendedPublicationTarget("tcm:0-2-65537");
target1.Destinations.Add(target1.Destinations[0]);
target2.Destinations.Add(target2.Destinations[0]);
target1.Save();
target2.Save();
scope.Dispose();
}
基本上,这是问题:我应该怎么做才能在我的 .Save() 方法中添加事务处理?
我尝试过以下方法:
[OperationContract]
[TransactionFlow(TransactionFlowOption.Allowed)]
public void Save()
{
_client.Save(targetData, readOptions);
}
但这并没有什么区别。有没有办法确定我当前是否处于事务中,并以某种方式“使用”该事务?我不想要求一个事务,只是想有在其中操作的选项。
谢谢,很抱歉发了这么长的帖子……只是想提供尽可能多的信息。
using
子句中有scope
变量,因此不应显式调用Dispose
。相反,当using
块结束时,它将自动被处理。 - Frank van Puffelen