コア サービスを使用してパブリケーション ターゲットへの宛先の追加と削除を支援するクラスを作成しました。宛先は通常、コア サービスを介して文字列 (XML コンテンツを含む) として公開されるため、その周りに独自のラッパーを作成するなどしました。
現在、2 つのパブリケーション ターゲットを更新する必要がある状況にあり、両方のターゲットが同時に更新されるようにトランザクション スコープを使用するのはクールだろうと考えました。
しかし、私はこれを実装するのに苦労しています。
コードの動作 (標準の 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);
}
しかし、違いはありませんでした。私が現在トランザクションに参加しているかどうかを判断し、何らかの方法でそのトランザクションを「使用」する方法はありますか? 私はトランザクションを要求したくありません。トランザクションで操作するオプションが欲しいだけです。
ありがとう、そして非常に長い投稿で申し訳ありません...できるだけ多くの情報を提供したかったのです。