এসকিউএল সার্ভার ২০০৮ আর টু ডার্টি পড়েছে - অ অণুবিক কীভাবে?


11

আমি ভাবছি "কতটা নোংরা" নোংরা পাঠাগুলি পড়ার-আপত্তিহীন বিচ্ছিন্নতার স্তরের অধীনে আসতে পারে । আমি বুঝতে পারি যে আপডেট করা হয়েছে তবে প্রতিশ্রুতিবদ্ধ নয় এমন সারিগুলি দৃশ্যমান, তবে:

  1. আংশিক আপডেট হওয়া হিসাবে কোনও সারিটি উপস্থিত হতে পারে - এটি হ'ল কিছু কলাম আপডেট হয়েছে এবং কিছুটি নয়?
  2. একটি একক কলাম আংশিক আপডেট হতে পারে। উদাহরণস্বরূপ, যদি আপনার কাছে একটি ভারচার (4000) কলাম থাকে যা সম্পূর্ণ আপডেট হওয়ার প্রক্রিয়াধীন ছিল এবং ধরে নেওয়া যায় যে এটিতে 4000 টি অক্ষর রয়েছে। আপনি কি পূর্বের রাজ্যের 2 ক চরগুলি এবং এর নতুন রাজ্য থেকে 2 কে চর পড়তে পারবেন? দৈর্ঘ্য> 8 কে সহ ভার্চার (সর্বাধিক) সম্পর্কে কী?

আপডেট: কিছু বিতর্ক করার পরে, সর্বনিম্ন sensক্যমত্য হ'ল যদি কলামের আকার> 8 কেবি হয় তবে নোংরা পাঠ্য এমনকি কলামের মধ্যেই সম্ভব possible

উত্তর:


7

মন্তব্যটি থেকে এমএসডিএন ফোরামের লিঙ্কটি পড়ার পরে সম্পাদিত , খুব আকর্ষণীয়।

বিচ্ছিন্নতা স্তর নির্বিশেষে, দুটি ব্যবহারকারী একসাথে একটি পৃষ্ঠা আপডেট করতে পারবেন না , বা কোনও ব্যবহারকারী আংশিকভাবে আপডেট হওয়া পৃষ্ঠাটি পড়তে পারবেন না। ভেবে দেখুন কীভাবে এসকিউএল সার্ভার এমন কোনও পৃষ্ঠার সাথে মোকাবেলা করবে যেখানে শিরোনামটি বলেছে কল 3 বাইট 17 থেকে শুরু হয় But তবে এটি সত্যই 25 বাইটে শুরু হয়, কারণ সারিটির অংশটি এখনও আপডেট হয়নি। কোনও ডাটাবেস হ্যান্ডেল করার উপায় নেই।

তবে 8k এর চেয়ে বড় সারিগুলির জন্য, একাধিক পৃষ্ঠাগুলি ব্যবহৃত হয় এবং এটি একটি অর্ধ-আপডেট হওয়া কলামকে সম্ভব করে তোলে। এমএসডিএন লিঙ্ক থেকে অনুলিপি করা হয়েছে (লিঙ্কটি ভেঙে যাওয়ার ক্ষেত্রে), এই কোয়েরিটি একটি উইন্ডোতে শুরু করুন:

if object_id('TestTable') is not null
    drop table TestTable
create table TestTable (txt nvarchar(max) not null)
go
insert into TestTable select replicate(convert(varchar(max),
    char(65+abs(checksum(newid()))%26)),100000)
go 10
update TestTable set txt=replicate(convert(varchar(max),
    char(65+abs(checksum(newid()))%26)),100000)
go 100000

এটি একটি সারণী তৈরি করে এবং তারপরে এটি একই চরিত্রের 100.000x এর স্ট্রিং সহ আপডেট করে। প্রথম ক্যোয়ারি চলাকালীন, অন্য একটি উইন্ডোতে এই ক্যোয়ারীটি শুরু করুন:

while 1=1 begin
 if exists (select * from TestTable (nolock) where left(Txt,1) <> right(Txt,1))
    break
end

অর্ধেক আপডেট হওয়া কলামটি পড়লে দ্বিতীয় ক্যোয়ারি বন্ধ হয়ে যায়। অর্থাৎ প্রথম চরিত্রটি যখন শেষের থেকে আলাদা হয়। অর্ধ-আপডেট হওয়া কলামগুলি পড়া সম্ভব কিনা তা প্রমাণ করে এটি দ্রুত শেষ হবে। আপনি যদি nolockইঙ্গিতটি সরিয়ে থাকেন তবে দ্বিতীয় কোয়েরিটি কখনই শেষ হবে না।

অবাক করার ফলাফল! অর্ধ-আপডেট হওয়া এক্সএমএল কলামটি একটি (nolock)প্রতিবেদনটি ভেঙে দিতে পারে, কারণ এক্সএমএলটি ত্রুটিযুক্ত।


1
সোশ্যাল.এমএসডিএন.মাইক্রোসফট.ফর্মেশনস / ইন- ইউএস / ট্রান্সট্যাক্সএল / থ্রেড / প্রতি এটি দৃশ্যত সত্য নয় , তবে কলামের ধরণগুলি আংশিকভাবে আপডেট হতে দেখা যায় তা এখনও কিছুটা রহস্য।

@ অ্যান্ডোমার আফাইক লেচগুলি আংশিকভাবে আপডেট হওয়া পৃষ্ঠাগুলি পড়তে বাধা দিতে পারে তবে যদি কোনও এনসিআই থেকে কিছু কলামের মান পড়ে তবে এটি সিআই থেকে একটি কলাম পুনরুদ্ধার করার জন্য বুকমার্ক অনুসন্ধান করেছিল। অধীনে NOLOCKআমি নিশ্চিত এটি একটি অবস্থা যেখানে NCI কলাম সারির এক সংস্করণ কিন্তু একটি ভিন্ন সংস্করণ থেকে সি আই থেকে ছিল ইঞ্জিনিয়ার আনা সম্ভব হবে। অতিরিক্তভাবে সারি ডেটা এবং লব পৃষ্ঠাগুলি ডেটা পৃষ্ঠায় ল্যাচ দ্বারা সুরক্ষিত হবে না।
মার্টিন স্মিথ

1
@ মার্টিন: সম্মত, আমি একটি স্ব-যোগদান দেখেছি nolockযার মূল সারিটি খুঁজে পাওয়া যায় না। তবে ক্ষেত্র বা সারির একক পঠন সামঞ্জস্যপূর্ণ হওয়া উচিত।
অ্যান্ডোমার

1
@ অ্যান্ডোমার, যদি না সারিতে কলামগুলি একাধিক পৃষ্ঠাগুলি বিস্তৃত হয়। আমার লিঙ্কটি দেখুন।

2
এটি সত্যই সিডব্লিউ হওয়া উচিত কারণ মূল উত্তরটি ঠিক ডান কাছাকাছি ছিল না, মাইকেল বর্তমান উত্তরটির সূচনাটি সরবরাহ করেছিল। প্রশ্নের বিরুদ্ধে আপনার মন্তব্য এখনও সম্পাদিত উত্তরের সাথে একমত নয়।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.