tekitoumemo’s diary

思ったことを書くだけ。長文版Twitter

【.Net Core】.Net Coreでも正式にTransactionScopeが使えるようになった!

https://4.bp.blogspot.com/-95JagEL6FDQ/WVgFqpNQeEI/AAAAAAAAE3A/Gtl6RqYjufcVH3jA7ydyh9GZGsGuHTkxACLcBGAs/s1600/DBvsDW.png

トランザクションを書くとき、成功したらcommit、失敗したらrollbackと結構めんどいのですが、それらを解決してくれるのがTransactionScopeです。例で書いた方がわかりやすいので以下で説明します。例はDapperを使います。

通常のトランザクション
cn.Open ();
using (var tr = cn.BeginTransaction ()) {
    try {
        cn.Execute ("UPDATE TEST SET Hoge = @Hoge Where ID = @ID", new { Hoge = 1, ID = 1 }, tr);
        // コミット
        tr.Commit ();
    } catch (Exception e) {
        // ロールバック
        tr.Rollback ();
    }
}
TransactionScopeのトランザクション
using (var tr = new TransactionScope ()) {
    cn.Open ();
    cn.Execute ("UPDATE TEST SET Hoge = @Hoge Where ID = @ID", new { Hoge = 1, ID = 1 });
    // コミット 落ちたらここにたどり着かないのでコミットされずにrollback?される(元に戻る?)
    tr.Complete ();
}

通常に比べてエラー処理など必要なく非常に楽です。Dapperの拡張ライブラリなどクエリを発行ごとにコネクションを作ってたりするので通常で使うには拡張しなければいけない場合があります(拡張ライブラリを拡張するとか、もうね)

System.Data.SqlClientの4.5 previewでは使えたのですが、正式のNugetには上がっていませんでした。

10日前にNugetに上がっていました!4.5.0-rc1ってやつです。
www.nuget.org

ちなみに「-rc」はNugetパッケージのプレリリースを指していて完全な正式版ではないのでお間違えないように(Nugetに上がってればおっけいでしょ)

System.Data.SqlClientのほかにSystem.Diagnostics.DiagnosticSourceも入れる必要があります。
www.nuget.org

導入方法

System.Data.SqlClientを追加

dotnet add package System.Data.SqlClient --version 4.5.0-rc1

System.Diagnostics.DiagnosticSourceを追加

dotnet add package System.Diagnostics.DiagnosticSource --version 4.5.0-rc1

※ 注意!「System.Data.SqlClient」と「System.Diagnostics.DiagnosticSource」はバージョンを合わせてください!落ちます。

ソース

using System.Data.SqlClient;
using System.Transactions;
using (var tr = new TransactionScope ()) {
    cn.Open ();
    cn.Execute ("UPDATE TEST SET Hoge = @Hoge Where ID = @ID", new { Hoge = 1, ID = 1 });
    tr.Complete ();
}

正式に?ってのはちょっと語弊があったかもしれませんがNugetに上がったので利用しやすくなっていると思います!Nugetじゃなくても良いって人は4.6preiewが出ているので試しても良いかもしれません。公式は以下に貼っておきます。
dotnet-core - System.Data.SqlClient 4.6.0-preview3-26501-04 - MyGet - Hosting your NuGet, npm, Bower, Maven, PHP Composer and Vsix packages