আমাদের প্রকল্পে আমরা আমাদের লেনদেনের মাধ্যমে ডেটা অ্যাক্সেস স্তরটি এর ক্রিয়া সম্পাদন করে তা নিশ্চিত করতে লেনদেনস্কোপ ব্যবহার করি। আমরা নিশানা করছি না MSDTC সেবা প্রয়োজন, আমাদের শেষ ব্যবহারকারীর মেশিনে সক্রিয় করা।
সমস্যাটি হল, আমাদের বিকাশকারীদের অর্ধেক মেশিনে আমরা এমএসডিটিসি অক্ষম হয়ে চালাতে পারি। অন্য অর্ধেকের অবশ্যই এটি সক্ষম থাকতে হবে অথবা তারা "[এমএসডিটিসি অন [সার্ভার] অনুপলব্ধ" ত্রুটি বার্তাটি পান।
এটি সত্যই আমাকে আমার মাথা আঁচড়ে গেছে এবং ADO.NET লেনদেনের বস্তুর উপর ভিত্তি করে কোনও হোম-স্প্যান ট্রানজেকশনস্কোপের মতো সমাধানটিতে ফিরে যাওয়ার বিষয়টি গুরুত্ব সহকারে বিবেচনা করেছে। এটা তোলে আপাতদৃষ্টিতে পাগলামি - আমাদের ডেভেলপার অর্ধেক হচ্ছে সে বিষয়ে একই কোডটি কাজ (এবং ধাপে ধাপে বৃদ্ধি করে না) করে অন্যান্য ডেভেলপার এর উপর ধাপে ধাপে বৃদ্ধি।
আমি কেন ট্রেসির আরও উত্তরের জন্য প্রত্যাশা করছিলাম কেন ডিটিসিতে লেনদেন বাড়ানো হয়েছিল তবে দুর্ভাগ্যক্রমে এটি হয় না।
এখানে কোডের একটি নমুনা বিট যা সমস্যার সৃষ্টি করবে, যে মেশিনগুলি আরও বাড়ানোর চেষ্টা করে, এটি দ্বিতীয় সংযোগে আরও বাড়ানোর চেষ্টা করে O খোলা () এবং (হ্যাঁ, অন্য কোনও সংযোগ খোলা নেই))
using (TransactionScope transactionScope = new TransactionScope() {
using (SqlConnection connection = new SqlConnection(_ConStr)) {
using (SqlCommand command = connection.CreateCommand()) {
// prep the command
connection.Open();
using (SqlDataReader reader = command.ExecuteReader()) {
// use the reader
connection.Close();
}
}
}
// Do other stuff here that may or may not involve enlisting
// in the ambient transaction
using (SqlConnection connection = new SqlConnection(_ConStr)) {
using (SqlCommand command = connection.CreateCommand()) {
// prep the command
connection.Open(); // Throws "MSDTC on [SERVER] is unavailable" on some...
// gets here on only half of the developer machines.
}
connection.Close();
}
transactionScope.Complete();
}
আমরা সত্যই খনন করেছি এবং এটি বের করার চেষ্টা করেছি। এটি যে মেশিনগুলিতে কাজ করে সেগুলি সম্পর্কে এখানে কিছু তথ্য রয়েছে:
- দেব 1: উইন্ডোজ 7 x64 এসকিউএল 2003
- দেব 2: উইন্ডোজ 7 x86 এসকিউএল 2003
- দেব 3: উইন্ডোজ 7 x64
এসকিউএল20035এসকিউএল2003
বিকাশকারীরা এটিতে কাজ করে না:
- দেব 4: উইন্ডোজ 7 x64,
এসকিউএল2003এসকিউএল2003 - দেব 5: উইন্ডোজ ভিস্তা x86, এসকিউএল 2003 5
- দেব 6: উইন্ডোজ এক্সপি এক্স 86, এসকিউএল 2003 5
- আমার হোম পিসি: উইন্ডোজ ভিস্তা হোম প্রিমিয়াম, x86, এসকিউএল 2003
আমার যুক্ত করা উচিত যে সমস্ত মেশিন, সমস্যাটি অনুসন্ধানের প্রয়াসে মাইক্রোসফ্ট আপডেট থেকে পাওয়া সমস্ত কিছুতে পুরোপুরি প্যাচ হয়ে গেছে।
আপডেট 1:
- http://social.msdn.microsoft.com/forums/en-US/windowstransferencesprogramming/thread/a5462509-8d6d88-aefa-a197456081d3/ একই ধরণের সমস্যার বর্ণনা দেয় ... 2006 সালে!
- http://msdn.microsoft.com/en-us/library/system.transferences.transferencescope%28VS.80%29.aspx - কোড নমুনাটি পড়ুন, এটি স্পষ্টভাবে একটি নেস্টেড-সেকেন্ড সংযোগ প্রদর্শন করে (দ্বিতীয় এসকিউএল সার্ভারের সাথে, আসলে) যা ডিটিসি-তে বাড়বে। আমরা আমাদের কোডে এটি করছি না - আমরা বিভিন্ন এসকিউএল সার্ভার ব্যবহার করি না, না আলাদা সংযোগের স্ট্রিং ব্যবহার করি না, না আমাদের গৌণ সংযোগগুলি খোলা থাকে - ডিটিসি তে বাড়ানো উচিত নয় ।
- http://davidhayden.com/blog/dave/archive/2005/12/09/2615.aspx (2005 থেকে) এসকিউএল 2000 এ সংযুক্ত হওয়ার সময় কীভাবে ডিটিসি-তে বাড়ানো সর্বদা ঘটবে তা সম্পর্কে আলোচনা করে। আমরা এসকিউএল 2003/2008 ব্যবহার করছি
- লেনদেনের বৃদ্ধির বিষয়ে http://msdn.microsoft.com/en-us/library/ms229978.aspx MSDN।
সেই এমএসডিএন লেনদেন-ক্রমবর্ধমান পৃষ্ঠাতে বলা হয়েছে যে নিম্নলিখিত শর্তগুলির কারণে ডিটিসিতে লেনদেন বাড়ানো হবে:
- কমপক্ষে একটি টেকসই সংস্থান যা একক-পর্যায়ের বিজ্ঞপ্তিগুলিকে সমর্থন করে না লেনদেনে তালিকাভুক্ত।
- কমপক্ষে দুটি টেকসই সংস্থান যা একক-পর্বের বিজ্ঞপ্তিগুলিকে সমর্থন করে লেনদেনে তালিকাভুক্ত। উদাহরণস্বরূপ, এর সাথে একটি একক সংযোগ তালিকাভুক্তি কোনও লেনদেনের প্রচারের কারণ হয় না। যাইহোক, আপনি যখনই কোনও ডাটাবেসের সাথে দ্বিতীয় সংযোগ খোলেন যার ফলে ডাটাবেস তালিকাভুক্ত হয়, সিস্টেম.অনলম্বন অবকাঠামো সনাক্ত করে যে এটি লেনদেনের দ্বিতীয় টেকসই উত্স, এবং এটি এমএসডিটিসি লেনদেনে বাড়িয়ে তোলে।
- একটি আলাদা অ্যাপ্লিকেশন ডোমেন বা বিভিন্ন প্রক্রিয়াতে লেনদেনের "মার্শাল" করার অনুরোধ রইল। উদাহরণস্বরূপ, কোনও অ্যাপ্লিকেশন ডোমেন সীমানা জুড়ে লেনদেনের অবজেক্টের সিরিয়ালাইজেশন। লেনদেনের অবজেক্টটি মার্শেল-বাই-মান হয়, এর অর্থ এটি কোনও অ্যাপ্লিকেশন ডোমেন সীমানা (এমনকি একই প্রক্রিয়াতেও) পেরিয়ে যাওয়ার যে কোনও প্রচেষ্টা লেনদেনের অবজেক্টের ক্রমিকায়নের ফলাফল দেয় in প্যারামিটার হিসাবে লেনদেন গ্রহণ করে এমন কোনও রিমোট পদ্ধতিতে কল করে আপনি লেনদেনের জিনিসগুলি পাস করতে পারেন বা আপনি কোনও দূরবর্তী লেনদেনের-পরিবেশন উপাদানটি অ্যাক্সেস করার চেষ্টা করতে পারেন। এটি লেনদেনের অবজেক্টটিকে সিরিয়ালাইজ করে এবং এর ফলে বৃদ্ধি ঘটে, যখন কোনও অ্যাপ্লিকেশন ডোমেন জুড়ে কোনও লেনদেন সিরিয়ালিত হয়। এটি বিতরণ করা হচ্ছে এবং স্থানীয় লেনদেনের পরিচালক এখন পর্যাপ্ত নেই।
আমরা # 3 অভিজ্ঞতা নিচ্ছি না। # 2 ঘটছে না কারণ একবারে কেবলমাত্র একটি সংযোগ থাকে এবং এটি একক 'টেকসই সংস্থান' এরও হয়। # 1 ঘটতে পারে এমন কোনও উপায় আছে কি? কিছু SQL2005 / 8 কনফিগারেশন যার কারণে এটি একক-পর্যায়ের বিজ্ঞপ্তিগুলি সমর্থন করে না?
আপডেট 2:
পুনরায় তদন্ত, ব্যক্তিগতভাবে, প্রত্যেকের এসকিউএল সার্ভার সংস্করণ - "ডেভ 3" এর আসলে এসকিউএল ২০০8 রয়েছে, এবং "দেব 4" আসলে এসকিউএল 2003 আছে। এটি আমাকে আমার সহকর্মীদের আর কখনও বিশ্বাস করতে শেখাবে না। ;) ডেটা পরিবর্তনের কারণে, আমি নিশ্চিত যে আমরা আমাদের সমস্যাটি পেয়েছি pretty আমাদের এসকিউএল ২০০৮ বিকাশকারীরা সমস্যাটি অনুভব করছিলেন না কারণ এসকিউএল ২০০৮ এর প্রচুর পরিমাণে দুর্দান্ত রয়েছে যার মধ্যে এসকিউএল ২০০৫ নেই 5
এটি আমাকে আরও বলেছে যে আমরা এসকিউএল ২০০৫ সমর্থন করব যা আমরা যেমন করতাম তেমনি ট্রানজেকশনস্কোপও ব্যবহার করতে পারি না এবং যদি আমরা ট্রানজেকশনস্কোপ ব্যবহার করতে চাই তবে আমাদের আশেপাশে একটি একক স্কেলকনেকশন বস্তুটি পাস করা দরকার ... যা এমন পরিস্থিতিতে সমস্যাযুক্ত বলে মনে হয় যেখানে স্কেল সংযোগটি সহজেই চারপাশে পাস করা যায় না ... এটি কেবল গ্লোবাল-স্কেল সংযোগের উদাহরণের গন্ধ। পিউ!
আপডেট 3
এই প্রশ্নে এখানে স্পষ্ট করে বলা:
SQL2008:
- একক ট্রানজেকশনস্কোপের মধ্যে একাধিক সংযোগগুলিকে মঞ্জুরি দেয় (উপরের নমুনা কোডে প্রদর্শিত হিসাবে))
- ক্যাভেট # 1: যদি এই একাধিক স্কেলক্লিকেশনগুলি বাসা বেঁধে রাখা হয়, অর্থাৎ একই সাথে দুটি বা ততোধিক স্ক্লোল সংযোগগুলি খোলা হয় তবে ট্রানজেকশনস্কোপ তত্ক্ষণাত্ ডিটিসি-তে প্রসারিত হবে।
- ক্যাভেট # 2: যদি একটি অতিরিক্ত 'এসকিউএল সংযোগটি অন্য একটি ' টেকসই সংস্থান ' (যেমন: একটি ভিন্ন এসকিউএল সার্ভার,) এ খোলা হয় তবে এটি তাত্ক্ষণিকভাবে ডিটিসি-তে প্রসারিত হবে
SQL2005:
- একক ট্রানজেকশনের সময়কালের মধ্যে একাধিক সংযোগের অনুমতি দেয় না allow এটি যখন বাড়বে তখন / যদি কোনও দ্বিতীয় স্কেল সংযোগ খোলা হয়।
আপডেট 4
এমনকি আরো এই প্রশ্নের উপার্জন স্বার্থে একটি জগাখিচুড়ি এর আরও স্বচ্ছতা দোহাই জন্য দরকারী, এবং, এখানে কিভাবে আপনি একটি সঙ্গে DTC করতে ধাপে ধাপে বৃদ্ধি করার SQL2005 পেতে পারেন একক SqlConnection
:
using (TransactionScope transactionScope = new TransactionScope()) {
using (SqlConnection connection = new SqlConnection(connectionString)) {
connection.Open();
connection.Close();
connection.Open(); // escalates to DTC
}
}
এটি কেবল আমার কাছে ভাঙা মনে হচ্ছে, তবে আমি অনুমান করি যে আমি যদি বুঝতে পারি SqlConnection.Open()
যে কানেকশন পুল থেকে প্রতিটি কল পেয়েছে।
"কেন এমন হতে পারে?" ঠিক আছে, আপনি যদি সেই সংযোগটি খোলার আগে তার বিপরীতে কোনও স্কেল টেবিলএডাপ্টার ব্যবহার করেন তবে স্কেল টেবিলএডাপ্টারটি সংযোগটি খুলবে এবং বন্ধ করবে, কার্যকরভাবে আপনার জন্য লেনদেন শেষ করে কারণ আপনি এখন এটি পুনরায় খুলতে পারবেন না।
সুতরাং, মূলত, এসকিউএল ২০০৫ এর সাথে ট্রানজেকশনস্কোপটি সফলভাবে ব্যবহার করার জন্য আপনার কোনও ধরণের গ্লোবাল সংযোগ অবজেক্ট থাকা দরকার যা প্রথম ট্রানজেকশনস্কোপের বিন্দু থেকে উন্মুক্ত থাকে, যতক্ষণ না এটি আর প্রয়োজন হয় না। কোনও বৈশ্বিক সংযোগের অবজেক্টের কোড-গন্ধ ছাড়াও, সংযোগটি প্রথমে খোলার এবং শেষ অবধি এটি বন্ধ করার পক্ষে যত তাড়াতাড়ি সম্ভব সংযোগটি খোলার এবং যত তাড়াতাড়ি সম্ভব এটি বন্ধ করার যুক্তির বিরোধিতা।