লেনদেনের স্কোপ কীভাবে লেনদেনকে রোল করে?


101

আমি একটি ইন্টিগ্রেশন টেস্ট লিখছি যেখানে আমি একটি ডাটাবেসে বেশ কয়েকটি অবজেক্ট সন্নিবেশ করিয়ে যাচ্ছি এবং তারপরে আমার পদ্ধতিটি সেই জিনিসগুলি পুনরুদ্ধার করে কিনা তা পরীক্ষা করে দেখছি।

ডাটাবেসের সাথে আমার সংযোগটি এনএইচবারনেটের মাধ্যমে ... এবং এই জাতীয় পরীক্ষা করার জন্য আমার নিয়মিত পদ্ধতিটি নিম্নলিখিত কাজগুলি করতে হবে:

NHibernateSession.BeginTransaction();

//use nhibernate to insert objects into database
//retrieve objects via my method
//verify actual objects returned are the same as those inserted

NHibernateSession.RollbackTransaction();

যাইহোক, আমি সম্প্রতি লেনদেনস্কোপ সম্পর্কে সন্ধান করেছি যা সম্ভবত এই উদ্দেশ্যেই ব্যবহার করা যেতে পারে ...

কিছু উদাহরণ কোড আমি খুঁজে পেয়েছি :

public static int AddDepartmentWithEmployees(Department dept)
{

    int res = 0;

    DepartmentAdapter deptAdapter = new DepartmentAdapter();
    EmployeeAdapter empAdapter = new EmployeeAdapter();
    using (TransactionScope txScope = new TransactionScope())
    {

        res += deptAdapter.Insert(dept.DepartmentName);
        //Custom method made to return Department ID 
        //after inserting the department "Identity Column"
        dept.DepartmentID = deptAdapter.GetInsertReturnValue();
        foreach(Employee emp in dept.Employees)
        {

            emp.EmployeeDeptID = dept.DepartmentID;
            res += empAdapter.Insert(emp.EmployeeName, emp.EmployeeDeptID);

        }
        txScope.Complete();

    }
    return res;

}

আমি বিশ্বাস করি যে যদি আমি লাইনটি অন্তর্ভুক্ত না txScope.Complete()করি তবে sertedোকানো ডেটাটি আবার ঘোরানো হবে। তবে দুর্ভাগ্যক্রমে আমি বুঝতে পারছি না যে এটি কীভাবে সম্ভব ... কীভাবে txScopeবস্তুটি ডাটাবেসের উপর deptAdapterএবং empAdapterবস্তু এবং তাদের লেনদেনের একটি ট্র্যাক রাখে।

আমার মনে হচ্ছে আমি এখানে কিছুটা তথ্য মিস করছি ... আমি কি আমার কোড ব্যবহার করে আমার BeginTransaction()এবং RollbackTransaction() কলগুলি প্রতিস্থাপন করতে সক্ষম TransactionScope?

যদি তা না হয় তবে কীভাবে TransactionScopeলেনদেনের পিছনে কাজ করা যায়?


আমি কখনও এনএইচবারনেট ব্যবহার করি নি তবে সম্ভবত এই লিঙ্কটি আপনাকে সহায়তা করবে।

আপনি যদি আপনার এনএইচবারনেট সেশনগুলি লেনদেনের জন্য গ্রুপ অপারেশন পরিচালনা করার জন্য আরও ভাল উপায়ের দিকে তাকিয়ে থাকেন তবে আপনি এই বিষয়টিতে আমার ব্লগ পোস্টটি পরীক্ষা করতে চাইতে পারেন ডটনেটক্রিস.ওয়ার্ডপ্রেস
ক্রিস মেরিসিক

উত্তর:


109

মূলত ট্রানজেকশনস্কোপ আপনার অ্যাডাপ্টারের ট্র্যাক করে না, এটি কী করে এটি ডাটাবেস সংযোগগুলি ট্র্যাক করে। আপনি যখন কোনও ডিবি সংযোগ খোলেন তখন সংযোগগুলি দেখতে পাবে যে কোনও অ্যাম্বিয়েন্ট ট্রানজেকশন (ট্রানজেকশন স্কোপ) আছে এবং যদি এটির সাথে তালিকাভুক্ত হয়। সতর্কতা যদি একই এসকিউএল সার্ভারের সাথে আরও একটি সংযোগ থাকে তবে এটি বিতরণ লেনদেনের দিকে বাড়বে।

আপনি যেহেতু একটি ব্যবহার ব্লক ব্যবহার করছেন তা নিষ্পত্তি নিশ্চিত করার পরে যা ঘটেছিল তার ব্যতিক্রম ঘটলে এমনকি ডাকা হবে। তাই যদি xxcope.complete () এর আগে নিষ্পত্তি কল করা হয় তবে ট্রানজেকশনস্কোপ সংযোগগুলিকে তাদের লেনদেনগুলি (বা ডিটিসি) রোলব্যাক করতে বলবে।


10
ট্রানজেকশনস্কোপ থ্রেডে বর্তমান লেনদেন ব্যতীত আর কিছুই ট্র্যাক করে না, এবং যদি এটি মডেলের উপর ভিত্তি করে প্রয়োজন হয় (প্রয়োজন হয়, নতুন প্রয়োজন হয় ইত্যাদি ইত্যাদি) এটি পরিবর্তন করে। লেনদেনটি কেবলমাত্র ডাটাবেস সংযোগ নয়, কেবল এর সাথে তালিকাভুক্ত এমন কোনও কিছুকে অবহিত করে।
CasperOne

4
আমি মনে করি এটি সম্পূর্ণ সত্য নয়। আমি ট্রানজেকশনস্কোপের উত্স কোডের একটি আংশিক ট্রেস করেছি এবং আমি এই এমএসডিএন.ইমক্রোসফটি /en-us/library/ms172152(v=vs.90).aspx ও দেখেছি যা বলে যে "যদি এটি লেনদেন না করে, কমিটমেন্টটি যখনই কমিটিটেবল ট্রান্সজেকশন অবজেক্টের মালিক দ্বারা ডাকা হয় তখনই কমিট হয়। সেই সময়ে ট্রানজেকশন ম্যানেজার রিসোর্স ম্যানেজারগুলিকে কল করে এবং ট্রানজেকশনস্কোপ অবজেক্টে সম্পূর্ণ পদ্ধতিটি আহ্বান করা হয়েছিল কিনা তার ভিত্তিতে তারা কমিট বা রোলব্যাক করতে অবহিত করে "" উত্স ট্রেস এছাড়াও এই আচরণ নির্দেশ করে।
ব্যবহারকারী 44298

আমি এই SO প্রশ্নোত্তর দরকারী: আইএনলিস্টমেন্ট নোটিকেশন
mungflesh

এখনও আমার কাছে অস্পষ্ট। দেখে মনে হয় যে লেনদেনের সুযোগের মধ্যে ডাকা পদ্ধতিগুলির সাথে অবজেক্টগুলি অবশ্যই লেনদেন ব্যবস্থার সাথে সহযোগী হতে হবে। তাদের অবশ্যই সিস্টেমের দ্বারা প্রতিশ্রুতিবদ্ধ / রোলব্যাক বিজ্ঞপ্তিগুলি সন্ধান করতে হবে এবং প্রয়োজনীয়তার সময় রোলব্যাকটি সম্পাদন করার জন্য যেহেতু তারা হ'ল তাদের পুনরায় ব্যাক করতে সক্ষম হবে (যদি কোনও ফাইল মোছার কাজটি কার্যকর করা হয়েছিল, স্পষ্টতই আমরা জাদুকরভাবে এটি রোল করতে পারি না যদি না আমরা গ্রহণ করি কিছু সতর্কতামূলক ব্যবস্থা)। এটি আরও মনে হয় যে এসকিউএল সার্ভার অপারেশনগুলি সহযোগিতামূলক। । নেট এ অন্য কোনও সমবায় বস্তু আছে? এবং সমবায় একটি ক্লাস কিভাবে লিখবেন? ডকুমেন্টেশন?
মিনিট

54

TransactionScopeবর্গ সঙ্গে কাজ করে Transactionবর্গ , যা থ্রেড-নির্দিষ্ট।

যখন TransactionScopeতৈরি করা হবে, এটি Transactionথ্রেডের জন্য আছে কিনা তা পরীক্ষা করে দেখুন ; যদি একটি বিদ্যমান থাকে তবে এটি এটি ব্যবহার করে, অন্যথায়, এটি একটি নতুন তৈরি করে এবং স্ট্যাকের উপরে ঠেলা দেয়।

যদি এটি একটি বিদ্যমান ব্যবহার করে, তবে এটি কেবল রিলিজের জন্য একটি কাউন্টার বাড়িয়ে তোলে (যেহেতু আপনাকে Disposeএটির কল করতে হবে)। শেষ প্রকাশে, যদি Transactionকমিট না করা হয়, তবে এটি সমস্ত কাজ পিছিয়ে যায়।

কেন ক্লাসগুলি লেনদেন সম্পর্কে জাদুকরভাবে জানে বলে মনে হচ্ছে, এই মডেলটির সাথে কাজ করতে ইচ্ছুক এমন শ্রেণীর জন্য এটি বাস্তবায়নের বিশদ হিসাবে রেখে গেছে।

যখন আপনি আপনার তৈরি deptAdapterএবং emptAdapterদৃষ্টান্ত, তারা যদি সেখানে থ্রেড (স্ট্যাটিক উপর একটি বর্তমান লেনদেনের রয়েছে কিনা তা পরীক্ষা Currentসম্পত্তি উপর Transactionবর্গ)। যদি সেখানে থাকে তবে Transactionকমিট / রোলব্যাক সিকোয়েন্সে অংশ নিতে (এটি Transactionনিয়ন্ত্রণ করে এবং বিভিন্ন লেনদেনের সমন্বয়কারী যেমন, কার্নেল, বিতরণ ইত্যাদি) এর প্রস্তাব দিতে পারে it


4
সুযোগের মধ্যে তৈরি স্কেল সংযোগ (গুলি) এর সাথে এটি কীভাবে কাজ করবে? স্কেল সংযোগ শ্রেণীটি কি অভ্যন্তরীণভাবে লেনদেনের ক্লাসটি ব্যবহার করে যা ট্রানজেকশনস্কোপের সাথে অন্তর্ভুক্ত তালিকাভুক্ত হয়? অথবা এটি সরাসরি টিএলএস-এ তালিকাভুক্ত হবে?
কাকিরা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.