অ্যাসিঙ্ক / অপেক্ষার সাথে কাজ করতে লেনদেনস্কোপ পান


114

আমি আমাদের সার্ভিস বাসে async/ সংহত করার চেষ্টা করছি await। আমি SingleThreadSynchronizationContextএই উদাহরণটির উপর ভিত্তি করে একটি বাস্তবায়ন করেছি http://blogs.msdn.com/b/pfxteam/archive/2012/01/20/10259049.aspx

এবং এটা কাজ করে জরিমানা, এক জিনিস ছাড়া: TransactionScope। আমি ভেতরের জিনিসগুলির জন্য অপেক্ষা করি TransactionScopeএবং এটি ভেঙে যায় TransactionScope

TransactionScopeasync/ এর সাথে দুর্দান্ত খেলবে বলে মনে হচ্ছে না await, কারণ এটি থ্রেডে জিনিসগুলি ব্যবহার করে সঞ্চয় করে ThreadStaticAttribute। আমি এই ব্যতিক্রম পাই:

"লেনদেনস্কোপ ভুলভাবে নেস্ট করেছে।"

আমি TransactionScopeকাজটি সারিবদ্ধ করার আগে ডেটা সংরক্ষণ করার চেষ্টা করেছি এবং এটি চালানোর আগে পুনরুদ্ধার করেছি তবে এটি কোনও জিনিস বদলেছে বলে মনে হচ্ছে না। আর TransactionScopeকোড একটি জগাখিচুড়ি, তাই এটি বুঝতে সেখানে কি ঘটছে সত্যিই কঠিন।

এটি কাজ করার কোন উপায় আছে? এর কোন বিকল্প আছে কি TransactionScope?


ট্রানজেকশনস্কোপের ত্রুটি পেস্টবিন.com/ এএইচ 1 ডিএক্সজি 4 এ পুনরুত্পাদন করার জন্য এখানে একটি খুব সহজ কোডটি এখানে ব্যতিক্রম ব্যতীত লেনদেন বাতিল রয়েছে
ইয়্যান

আপনি কি কেবল নিয়মিত এসকিউএল লেনদেন ব্যবহার করতে পারবেন? অথবা আপনি একাধিক সংস্থান ছড়িয়ে দিচ্ছেন?
মার্ক গ্র্যাভেল

আমি একাধিক রিসোর্সগুলি বিস্তৃত করছি
ইয়ান

দেখে মনে হচ্ছে আপনাকে হয় আপনার async পদ্ধতিতে সুযোগটি পাস করতে হবে, বা এটি আপনার কার্য ইউনিটের সাথে চিহ্নিত কোনও সাধারণ প্রসঙ্গ থেকে এটিকে পুনরুদ্ধার করার উপায় দেবে।
বার্ট্র্যান্ড লে রায়

SingleThreadSynchronizationContextপ্রতিটি শীর্ষ স্তরের জন্য আপনার নিজস্ব আলাদা আলাদা থ্রেডের প্রয়োজন হবে TransactionScope
স্টিফেন ক্লিয়ারি

উত্তর:


161

.NET ফ্রেমওয়ার্ক ৪.৫.১ এ প্যারামিটার নেওয়ার জন্য নতুন কনস্ট্রাক্টরেরTransactionScope একটি সেট রয়েছে TransactionScopeAsyncFlowOption

এমএসডিএন অনুসারে, এটি থ্রেড ধারাবাহিকতা জুড়ে লেনদেন প্রবাহকে সক্ষম করে।

আমার বোঝার অর্থ হ'ল এটি আপনাকে এই জাতীয় কোড লেখার অনুমতি দেওয়ার জন্য:

// transaction scope
using (var scope = new TransactionScope(... ,
  TransactionScopeAsyncFlowOption.Enabled))
{
  // connection
  using (var connection = new SqlConnection(_connectionString))
  {
    // open connection asynchronously
    await connection.OpenAsync();

    using (var command = connection.CreateCommand())
    {
      command.CommandText = ...;

      // run command asynchronously
      using (var dataReader = await command.ExecuteReaderAsync())
      {
        while (dataReader.Read())
        {
          ...
        }
      }
    }
  }
  scope.Complete();
}

10

একটি উত্তরের জন্য দেরি করে ফেলুন তবে এমভিসি 4 এর সাথে আমারও একই সমস্যা ছিল এবং আমি প্রজেক্টে যান প্রোজেক্টে ডান ক্লিক করে আমার প্রকল্পটি 4.5 থেকে 4.5.1 পর্যন্ত আপডেট করেছি। অ্যাপ্লিকেশন ট্যাব নির্বাচন করুন টার্গেট ফ্রেমওয়ার্কটি 4.5.1 এ পরিবর্তন করুন এবং লেনদেনকে অনুসরণ হিসাবে ব্যবহার করুন।

using (AccountServiceClient client = new AccountServiceClient())
using (TransactionScope scope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled))
{
}

2
এটি কীভাবে গৃহীত উত্তর
লিয়াম

6

আপনি ট্রানজেকশন দ্বারা তৈরি DependentTransaction ব্যবহার করতে পারেন। ডিপেন্ডেন্টক্লোন () পদ্ধতি:

static void Main(string[] args)
{
  // ...

  for (int i = 0; i < 10; i++)
  {

    var dtx = Transaction.Current.DependentClone(
        DependentCloneOption.BlockCommitUntilComplete);

    tasks[i] = TestStuff(dtx);
  }

  //...
}


static async Task TestStuff(DependentTransaction dtx)
{
    using (var ts = new TransactionScope(dtx))
    {
        // do transactional stuff

        ts.Complete();
    }
    dtx.Complete();
}

ডিপেন্ডেন্ট ট্রান্সজেকশন সহ কনকুরঞ্জি পরিচালনা করা

http://adamprescott.net/2012/10/04/transactionscope-in-multi-threaded-applications/


2
অ্যাডাম প্রেসকোটের উদাহরণস্বরূপ শিশু কার্যটি async হিসাবে চিহ্নিত করা হয়নি। আপনি যদি await Task.Delay(500)এই প্যাটার্নের সাথে "ডু ট্রানজেকশনাল স্টাফ" প্রতিস্থাপন করেন তবে এটি ব্যর্থও হবেন TransactionScope nested incorrectlyকারণ শিশুটির কার্য সঠিকভাবে সম্পন্ন হওয়ার আগে বহিরাগত ট্রান্সজেকশনস্কোপ (উপরের উদাহরণে প্রদর্শিত হয়নি) সুযোগ থেকে বেরিয়ে যায়। প্রতিস্থাপন awaitসঙ্গে Task.Wait()এবং এটি কাজ করে, তখন কিন্তু আপনি সুবিধাগুলো হারিয়ে ফেলেছি async
mdisibio

সমস্যাটি সমাধানের এটি একটি কঠিন উপায়। লেনদেনস্কোপ হ'ল সমস্ত নদীর গভীরতানির্ণয়কে আড়াল করা।
এনিওলা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.