.Net এ লেনদেন


144

সি #। নেট 2.0। এ লেনদেন করার সেরা অনুশীলনগুলি কী কী? ক্লাস কি ব্যবহার করা উচিত? সমস্যাগুলি কী কী তা খুঁজে বের করার জন্য ইত্যাদি commit যা প্রতিশ্রুতিবদ্ধ এবং রোলব্যাক স্টাফ। আমি কেবল একটি প্রকল্প শুরু করছি যেখানে ডিবিতে ডেটা .োকানোর সময় আমার কিছু লেনদেনের প্রয়োজন হতে পারে। লেনদেন সম্পর্কে এমনকি মৌলিক সামগ্রীর জন্য যে কোনও প্রতিক্রিয়া বা লিঙ্কগুলি স্বাগত।


একটি প্রারম্ভিক হিসাবে ব্যবহার করার জন্য কোডপোজেজেট। নেট মধ্যে লেনদেনগুলির একটি ভাল উদাহরণ এখানে ।
মিচেল বিক্রেতারা

উত্তর:


271

এখানে 2 প্রধান ধরণের লেনদেন হয়; সংযোগ লেনদেন এবং পরিবেষ্টনের লেনদেন। সংযোগের লেনদেন (যেমন স্কেল ট্রান্সজেকশন) সরাসরি ডিবি সংযোগের সাথে আবদ্ধ (যেমন এসকিএল কানেকশন), যার অর্থ আপনাকে সংযোগটি প্রায় পাশের দিকে চালিয়ে যেতে হবে - কিছু ক্ষেত্রে ঠিক আছে, তবে "তৈরি / ব্যবহার / প্রকাশ" অনুমতি দেয় না ব্যবহার, এবং ক্রস- db কাজ অনুমতি দেয় না। একটি উদাহরণ (স্থানের জন্য ফর্ম্যাট করা):

using (IDbTransaction tran = conn.BeginTransaction()) {
    try {
        // your code
        tran.Commit();
    }  catch {
        tran.Rollback();
        throw;
    }
}

খুব অগোছালো নয়, তবে আমাদের সংযোগ "সংযোগ" সীমাবদ্ধ। আমরা যদি বিভিন্ন পদ্ধতিতে কল করতে চাই তবে আমাদের এখন "সংযোগ" চারপাশে পাস করতে হবে।

বিকল্পটি একটি পরিবেশন লেনদেন; .NET 2.0 এ নতুন, ট্রানজেকশনস্কোপ অবজেক্ট (System.Transferences.dll) বিভিন্ন অপারেশন ব্যবহারের অনুমতি দেয় (উপযুক্ত সরবরাহকারীরা স্বয়ংক্রিয়ভাবে পরিবেশনার লেনদেনে তালিকাভুক্ত হবে)। এটি বিদ্যমান (অ-লেনদেনের) কোডটিতে retro-ফিট করা এবং একাধিক সরবরাহকারীর সাথে কথা বলা সহজ করে তোলে (যদিও আপনি একাধিকের সাথে কথা বললে ডিটিসি জড়িত হবে)।

উদাহরণ স্বরূপ:

using(TransactionScope tran = new TransactionScope()) {
    CallAMethodThatDoesSomeWork();
    CallAMethodThatDoesSomeMoreWork();
    tran.Complete();
}

এখানে নোট করুন যে দুটি পদ্ধতি তাদের নিজস্ব সংযোগগুলি পরিচালনা করতে পারে (উন্মুক্ত / ব্যবহার / বন্ধ / নিষ্পত্তি), তবুও তারা নিঃশব্দে আমাদের কিছু পাস না করে পরিবেশনীয় ব্যবসায়ের অংশ হয়ে যাবে।

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

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

সব মিলিয়ে একটি খুব, খুব দরকারী অবজেক্ট।

কিছু সতর্কতা:

  • এসকিউএল সার্ভার 2000-এ, একটি লেনদেনস্কোপ তাত্ক্ষণিকভাবে ডিটিসিতে যাবে; এটি এসকিউএল সার্ভার ২০০৫ এবং তারপরে স্থির করা হয়েছে, আপনি ডিটিসিতে উন্নীত না হওয়া পর্যন্ত এটি 2 টি উত্স ইত্যাদির সাথে কথা না হওয়া পর্যন্ত এটি এলটিএম (অনেক কম ওভারহেড) ব্যবহার করতে পারে।
  • এখানে একটি সমস্যা রয়েছে যার অর্থ আপনার সংযোগের স্ট্রিংটি টুইঙ্ক করার দরকার হতে পারে

CSLA .NET 2.0 ট্রানজেকশনস্কোপ অবজেক্টকে সমর্থন করে!
বিনোজ অ্যান্টনি

এখানে সমস্যাটি যখন আপনি প্রথম পদ্ধতিতে লেনদেন করেন এবং এই পদ্ধতিটি (এনক্যাপসুলেশন) জানেন না যে পিতামাতার লেনদেন থেকে ডাকা হবে কি না।
এডুয়ার্ডো মোল্টেনি

1
@ এডুয়ার্ডো - ট্রানজেকশনস্কোপ ব্যবহার করার সময় এটি কোনও সমস্যা নয়, এটি খুব আকর্ষণীয় করে তোলে। এই জাতীয় লেনদেন বাসা বাঁধে এবং কেবল বহিরাগতদেরই প্রতিশ্রুতি দেয়।
মার্ক গ্র্যাভেল

আমি আশা করি আপনি এখনও শুনছেন। আপনি বলেছিলেন যে এখানে "কয়েকটি ট্রানজেকশনস্কোপ-সামঞ্জস্যপূর্ণ অবজেক্ট মডেল" রয়েছে। আপনি কি তাদের কিছু আমাকে নির্দেশ করতে পারেন? ধন্যবাদ.
majkinetor

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

11
protected void Button1_Click(object sender, EventArgs e)
   {


       using (SqlConnection connection1 = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\Database.mdf;Integrated Security=True;User Instance=True"))
       {
           connection1.Open();

           // Start a local transaction.
           SqlTransaction sqlTran = connection1.BeginTransaction();

           // Enlist a command in the current transaction.
           SqlCommand command = connection1.CreateCommand();
           command.Transaction = sqlTran;

           try
           {
               // Execute two separate commands.
               command.CommandText =
                "insert into [doctor](drname,drspecialization,drday) values ('a','b','c')";
               command.ExecuteNonQuery();
               command.CommandText =
                "insert into [doctor](drname,drspecialization,drday) values ('x','y','z')";
               command.ExecuteNonQuery();

               // Commit the transaction.
               sqlTran.Commit();
               Label3.Text = "Both records were written to database.";
           }
           catch (Exception ex)
           {
               // Handle the exception if the transaction fails to commit.
               Label4.Text = ex.Message;


               try
               {
                   // Attempt to roll back the transaction.
                   sqlTran.Rollback();
               }
               catch (Exception exRollback)
               {
                   // Throws an InvalidOperationException if the connection 
                   // is closed or the transaction has already been rolled 
                   // back on the server.
                   Label5.Text = exRollback.Message;

               }
           }
       }


   }

4

আপনি লেনদেনটিকে নিজের স্টোরেজ পদ্ধতিতেও গুটিয়ে রাখতে পারেন এবং সি # তে লেনদেন না করে সেভাবে পরিচালনা করতে পারেন।


1

আপনার যদি কেবল ডিবি-সম্পর্কিত স্টাফের জন্য এটির প্রয়োজন হয় তবে কিছু ওআর ম্যাপার্স (যেমন এনএইচবারনেট) ডিফল্টরূপে বাক্সের বাইরে ট্রান্সস্যাক্টিনো সমর্থন করে।


0

এটি আপনার প্রয়োজনের উপরও নির্ভর করে। বেসিক এসকিউএল লেনদেনের জন্য আপনি আপনার কোডটিতে শুরু করুন আর কমিট ট্রান্স ব্যবহার করে টিএসকিউএল লেনদেন করার চেষ্টা করতে পারেন। এটি সহজতম উপায় তবে এতে জটিলতা রয়েছে এবং আপনাকে যথাযথভাবে প্রতিশ্রুতিবদ্ধ হতে হবে (এবং রোলব্যাক)।

আমি এরকম কিছু ব্যবহার করব

SQLTransaction trans = null;
using(trans = new SqlTransaction)
{
    ...
    Do SQL stuff here passing my trans into my various SQL executers
    ...
    trans.Commit  // May not be quite right
}

যে কোনও ব্যর্থতা আপনাকে usingএকেবারে সরিয়ে ফেলবে এবং লেনদেন সর্বদা কমিট বা রোলব্যাক করবে (আপনি এটি করতে বললে তার উপর নির্ভর করে)। আমাদের সবচেয়ে বড় সমস্যাটি হ'ল এটি সর্বদা প্রতিশ্রুতিবদ্ধ হওয়া নিশ্চিত করা। ব্যবহার নিশ্চিত করে লেনদেনের সুযোগ সীমিত।

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