উত্তর:
এখানে কোড স্নিপেট:
using System.Transactions;
....
using (var transactionScope = new TransactionScope())
{
DoYourDapperWork();
transactionScope.Complete();
}
নোট করুন যে আপনাকে System.Transactionsসমাবেশে রেফারেন্স যুক্ত করতে হবে কারণ এটি ডিফল্টরূপে উল্লেখ করা হয়নি।
Dispose()পদ্ধতিতে এটি স্বয়ংক্রিয়ভাবে এটি করেন । যদি Complete()না ডাকা হয়, তবে লেনদেন আবার ফিরে আসে।
TransctionScopeআপনি এই উত্তরটি বেছে নেওয়ার ক্ষেত্রে সংযোগটি অবশ্যই ব্লকটি ব্যবহার করে খোলার দরকার।
আমি সরাসরি সংযোগ থেকে লেনদেন পেয়ে আরও স্বজ্ঞাত পন্থা ব্যবহার করতে পছন্দ করেছি:
// This called method will get a connection, and open it if it's not yet open.
using (var connection = GetOpenConnection())
using (var transaction = connection.BeginTransaction())
{
connection.Execute(
"INSERT INTO data(Foo, Bar) values (@Foo, @Bar);", listOf5000Items, transaction);
transaction.Commit();
}
.BeginTransaction()এটা? যদি এটি হয়ে থাকে তবে এই এক্সটেনশন পদ্ধতিটি লেনদেনের ভুল ব্যবহারের প্রচার করবে। (আইএমও, এটি এমনকি "সংযোগটি ইতিমধ্যে খোলার পরেও লেনদেন খুলতে পারে না" নিক্ষেপ করা উচিত))
Execute, এটি যেমন প্রয়োজন।
আপনার ব্যবহার করতে সক্ষম হবেন TransactionScopeযেহেতু ড্যাপার কেবলমাত্র ADO.NET কমান্ড চালায়।
using (var scope = new TransactionScope())
{
// insert
// insert
scope.Complete();
}
আপনার সমস্ত সারণী একক ডাটাবেসে রয়েছে বিবেচনা করে, আমি TransactionScopeএখানে কিছু উত্তরের প্রস্তাবিত সমাধানের সাথে একমত নই । পড়ুন এই উত্তর।
TransactionScopeসাধারণত বিতরণ লেনদেনের জন্য ব্যবহৃত হয়; বিভিন্ন ডাটাবেস বিস্তৃত লেনদেন বিভিন্ন সিস্টেমে হতে পারে। অপারেটিং সিস্টেম এবং এসকিউএল সার্ভারের জন্য এটির কিছু কনফিগারেশন প্রয়োজন যা এগুলি কাজ করবে না। আপনার সমস্ত প্রশ্ন যদি ডাটাবেসের একক উদাহরণের বিরুদ্ধে থাকে তবে এটির প্রস্তাব দেওয়া হয় না।
তবে, একক ডাটাবেসের সাহায্যে এটি কার্যকর হতে পারে যখন আপনার নিয়ন্ত্রণে নেই এমন লেনদেনে কোডটি অন্তর্ভুক্ত করতে হবে। একক ডাটাবেস সহ এটির জন্য বিশেষ কনফিগারেশনও প্রয়োজন হয় না।
connection.BeginTransactionএকক ডাটাবেসের বিপরীতে লেনদেন (সি #, ভিবি। নেট ইত্যাদি) বাস্তবায়নের জন্য ADO.NET সিনট্যাক্স। এটি একাধিক ডাটাবেস জুড়ে কাজ করে না।
সুতরাং, connection.BeginTransaction()যেতে ভাল উপায়।
এমনকি লেনদেন পরিচালনার সর্বোত্তম উপায় হ'ল ইউনিট অফ ওয়ার্ককে এই উত্তরে বর্ণিত হিসাবে প্রয়োগ করা ।
TransactionScopeওপি যা চায় তার জন্য অদক্ষ যা ব্যবহার করার পরামর্শ দেয় । আমি একমত যে TransactionScopeএটি অনেক ক্ষেত্রে ভাল হাতিয়ার; কিন্তু এই না।
ড্যানিয়েলের উত্তর আমার প্রত্যাশার মতো কাজ করেছিল। সম্পূর্ণতার জন্য, এখানে একটি স্নিপেট যা কোনও লেনদেনের সুযোগ এবং ড্যাপার ব্যবহার করে প্রতিশ্রুতিবদ্ধতা এবং রোলব্যাক প্রদর্শন করে:
using System.Transactions;
// _sqlConnection has been opened elsewhere in preceeding code
using (var transactionScope = new TransactionScope())
{
try
{
long result = _sqlConnection.ExecuteScalar<long>(sqlString, new {Param1 = 1, Param2 = "string"});
transactionScope.Complete();
}
catch (Exception exception)
{
// Logger initialized elsewhere in code
_logger.Error(exception, $"Error encountered whilst executing SQL: {sqlString}, Message: {exception.Message}")
// re-throw to let the caller know
throw;
}
} // This is where Dispose is called
Disposeপদ্ধতিটিকে প্রথম বা দ্বিতীয় বলা হয় তা আমি যোগাযোগ করার চেষ্টা করিনি , কেবল এটিই দু'বার বলা হয়েছিল। "দ্বিতীয় বার নিষ্পত্তি করা কল্পনা করা ক্ষতিকারক নয়" এমন বিষয়টি, এটি একটি বড় অনুমান। আমি শিখেছি ডক্স এবং প্রকৃত বাস্তবায়ন প্রায়শই একমত হয় না। তবে আপনি যদি এর জন্য মাইক্রোসফ্টের শব্দটি চান: msdn.microsoft.com/en-us/library/…