আমি আশা করছি যে কেউ এই আচরণ সম্পর্কে কিছুটা আলোকপাত করতে পারে যা আমি এসএনএপশট বিচ্ছিন্নতা বনাম ট্র্যাঙ্কেটের বিষয়ে আশা করিনি।
ডাটাবেস: স্ন্যাপশট বিচ্ছিন্ন করার অনুমতি দিন = সত্য; ইজ পড়ুন কমিটেড স্ন্যাপশট চালু = মিথ্যা।
প্রক্রিয়া 1 (প্রচুর যোগদানের সাথে একটি দীর্ঘ-চলমান জটিল SELECT থেকে টেবিল ফু এর সামগ্রী প্রতিস্থাপন করে):
BEGIN TRAN;
TRUNCATE TABLE foo;
INSERT INTO foo SELECT...;
COMMIT;
প্রক্রিয়া 2 (টেবিল ফু থেকে পড়া):
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
SELECT * FROM foo;
যদি প্রসিডিউর 1 চলমান থাকে যখন প্রসেসর 2 কার্যকর করা হয়, তবে প্রক্রিয়া 2 শেষ না হওয়া অবধি LCK_M_SCH_S অপেক্ষা (sp_WhoIsActtive অনুযায়ী) ধরে রাখা হবে। এবং যখন প্রক্রিয়া 2 সম্পূর্ণ হয়, এটি এই ব্যতিক্রম উত্থাপন করে:
স্ন্যাপশট বিচ্ছিন্ন লেনদেন ডাটাবেস 'ডাটাবেসনাম' এ ব্যর্থ হয়েছে কারণ বিবরণী দ্বারা অ্যাক্সেস করা অবজেক্টটি এই লেনদেন শুরুর পর থেকে অন্য একসাথে লেনদেনে একটি ডিডিএল স্টেটমেন্ট দ্বারা পরিবর্তিত হয়েছে। এটি অনুমোদিত নয় কারণ মেটাডেটা সংস্করণযুক্ত নয়। স্ন্যাপশট বিচ্ছিন্নতার সাথে মেশানো হলে মেটাডেটার সাথে একযোগে আপডেট অসঙ্গতি হতে পারে।
তবে মাইক্রোসফ্ট এসএনএপএসএইচটিওটি বিচ্ছিন্নকরণের অধীনে অনুমোদিত নয় এমন ডিডিএল স্টেটমেন্ট হিসাবে ট্রুনসেটকে তালিকাবদ্ধ করে না: http://msdn.microsoft.com/en-us/library/bb933783.aspx
স্পষ্টতই আমি কিছু সঠিকভাবে বুঝতে পারছি না, কারণ আমি ট্র্যাকসিকেটের আগে টেবিল থেকে সর্বাধিক প্রতিশ্রুতিবদ্ধ ডেটা তাত্ক্ষণিকভাবে প্রসেসর 1 দ্বারা প্রেরণ করা বা প্রক্রিয়া 1 দ্বারা ধরে রাখা এবং তারপরে নতুন বিষয়বস্তু ফিরিয়ে দেওয়ার সবচেয়ে খারাপ কেসটি আশা করেছি টেবিল। তুমি কি সাহায্য করতে পারো?