پست

استفاده از Transaction متودهای async در Net

یکی از موارد مهم استفاده از ترنزکشن در .Net دقت کردن به استفاده از متود async / await در داخل آن است. بطور مثال کد زیر را در نظر بگیرید:

1
2
3
4
5
6
7
8
9
using (var scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions
        {
            IsolationLevel = IsolationLevel.ReadCommitted
        }))
{
    await DoWorkAsync(model);

    scope.Complete();
}

در این مواقع ممکن است با خطا زیر مواجه شوید و هیچ اطلاعی از Exception واقعی اتفاق افتاده در متود await نیز ثبت نمی‌شود و فقط با دیباگ متوجه خطا اصلی می‌شوید.

The operation is not valid for the state of the transaction

برای حل این مشکل کافی است از TransactionScopeAsyncFlowOption.Enabled استفاده کنید.

1
2
3
4
5
6
7
8
9
using (var scope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions
        {
            IsolationLevel = IsolationLevel.ReadCommitted
        }, TransactionScopeAsyncFlowOption.Enabled))
{
    await DoWorkAsync(model);

    scope.Complete();
}

در واقع استفاده از await باعث تغییر Thread می‌شود و TransactionScope کامل نمی‌شود. پس حتما پارامتر گفته شده باید پاس داده شود تا مشکل فوق پیش نیاید.