LightSwitchファーストタッチ2(トランザクション)

Lightswitchを少し触ったので気づいた点をメモ。
Submitでの更新はトランザクションとして処理される。検索の分離レベルはReadCommitted、サブミット(更新)はRepeatableReadで、既定ではDTCは利用されない。DTCを利用したい場合や明示的なトランザクションスコープを制御したい場合ExecutingとExecutedのイベントでTransactionScopeを利用する。

        private TransactionScope trnScope;
        partial void SaveChanges_Executing()
        {
            trnScope = new TransactionScope(
                TransactionScopeOption.Required,
                new TransactionOptions {
                    IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted
                });
        }
        partial void SaveChanges_Executed()
        {
            trnScope.Complete();
            trnScope.Dispose();
        }

Submitパイプライン

クライアントでSubmitした後に動作するサーバー側処理。クライアントで行われたエンティティの変更をサーバー側でリプレイするような感じで動作する。

    1. SaveChanges_CanExecute処理
    2. SaveChanges_Executing処理
    3. EntitySet_CanRead, CanInsert, CanUpdate, CanDelete
    4. 変更・追加したエンティティのプロパティの検証
    5. EntitySet_Validate処理
    6. EntitySet_Inserting処理
    7. EntitySet_Updating処理
    8. EntitySet_Deleting処理
    9. DB更新処理(データプロバイダ経由で更新)
    10. EntitySet_Inserted処理
    11. EntitySet_Updated処理
    12. EntitySet_Deleted処理
    13. SaveChanges_Executed処理
    14. SaveChanges_ExecuteFailed処理

その他

今回の内容の元資料は以下の資料、少し古いけどPart1アーキテクチャPart2は画面関連とLightSwitchの基本的な構造を把握するのに良いかも。
The Anatomy of a LightSwitch Application Part 3 – the Logic Tier

画面から2つのデータソースを更新する方法は以下を参考。トランザクションは各データソースことになるので注意。
Using Both Remote and Local Data in a LightSwitch Application

ここまでやってよいかは?ですが、どうしても同一トランザクションで処理したい場合RIAサービスを作成してLightSwitchのデータベースをRIAサービスから更新することもできるかもしれません。このサンプルWCF RIA Service: Combining Two TablesでRIAサービスからLightSwitch組み込みのDBをアクセスする方法が紹介されています。