আমি কি এসকিউএল সার্ভার আইডেন্টিটি মানগুলি ক্রমানুসারে পড়ার উপর নির্ভর করতে পারি?


24

টিএল; ডিআর: নীচের প্রশ্নটি নীচে ফুটে উঠেছে: একটি সারি সন্নিবেশ করার সময় , একটি নতুন মান উত্পন্ন করার সময় এবং ক্লাস্টারড ইনডেক্সে সংশ্লিষ্ট সারি কীটি লক করার মধ্যে সুযোগের একটি উইন্ডো রয়েছে, যেখানে কোনও বহিরাগত পর্যবেক্ষক নতুন দেখতে পাবে? একসাথে লেনদেন দ্বারা মান ?োকানো? (এসকিউএল সার্ভারে।)Identity Identity

বিস্তারিত সংস্করণ

আমি একজন সঙ্গে একটি SQL সার্ভার টেবিল আছে Identityকলাম নামক CheckpointSequence, যা সারণীর ক্লাস্টার সূচক কী (যা অতিরিক্ত nonclustered ইনডেক্স একটি নম্বর আছে) হয়। সারিগুলি বেশ কয়েকটি সমবর্তী প্রক্রিয়া এবং থ্রেড (বিচ্ছিন্ন স্তরে এবং বাইরে ) সারণিতে সন্নিবেশ করা হয় । একই সময়ে, সেখানে প্রসেস পর্যায়ক্রমে হয় পড়া ক্লাস্টার সূচি থেকে সারি, যে দ্বারা আদেশ কলাম (এছাড়াও বিচ্ছিন্নতা পর্যায়ে , সঙ্গে বিকল্প বন্ধ পরিণত হচ্ছে)।READ COMMITTEDIDENTITY_INSERTCheckpointSequenceREAD COMMITTEDREAD COMMITTED SNAPSHOT

আমি বর্তমানে এই বাস্তবতার উপর নির্ভর করি যে পড়ার প্রক্রিয়াগুলি কখনই একটি চেকপয়েন্টকে "এড়িয়ে যেতে" পারে না। আমার প্রশ্ন: আমি কি এই সম্পত্তির উপর নির্ভর করতে পারি? এবং যদি তা না হয় তবে আমি এটি সত্য করার জন্য কী করতে পারি?

উদাহরণ: যখন পরিচয় মান 1, 2, 3, 4, এবং 5 সহ সারি সন্নিবেশ করা হয়, তখন পাঠককে 4 মান সহ 4 টির আগে সারিটি দেখতে হবে না ests টেস্টগুলি দেখায় যে কোয়েরিতে একটি ORDER BY CheckpointSequenceধারা রয়েছে ( এবং একটি WHERE CheckpointSequence > -1ধারা), যখনই সারি 4 পড়তে হবে বিশ্বস্তভাবে অবরুদ্ধ হয়, তবে এখনও প্রতিশ্রুতিবদ্ধ হয় না, এমনকি সারি 5 ইতিমধ্যে প্রতিশ্রুতিবদ্ধ হয়ে থাকলেও।

আমি বিশ্বাস করি যে তাত্ত্বিকভাবে কমপক্ষে, এখানে একটি দৌড়ের শর্ত থাকতে পারে যা এই ধারণাটি ভাঙ্গার কারণ হতে পারে। দুর্ভাগ্যক্রমে, ডকুমেন্টেশন একাধিক সমবর্তী লেনদেনের প্রসঙ্গে Identityকীভাবে Identityকাজ করে সে সম্পর্কে খুব বেশি কিছু বলে না , এটি কেবলমাত্র "প্রতিটি নতুন মান বর্তমান বীজ এবং বর্ধনের উপর ভিত্তি করে উত্পন্ন হয়"। এবং "নির্দিষ্ট লেনদেনের জন্য প্রতিটি নতুন মান টেবিলের অন্যান্য সমবর্তী লেনদেনের চেয়ে আলাদা।" ( এমএসডিএন )

আমার যুক্তিটি হ'ল, এটি অবশ্যই এইরকমভাবে কাজ করবে:

  1. একটি লেনদেন শুরু হয় (হয় স্পষ্টভাবে বা স্পষ্টভাবে)।
  2. একটি পরিচয় মান (এক্স) উত্পন্ন হয়।
  3. সম্পর্কিত সারি লকটি সনাক্তকরণ মানের উপর ভিত্তি করে ক্লাস্টারড ইনডেক্সে নেওয়া হয় (যদি না লক এস্কলেশন লাথি দেয়, তবে পুরো টেবিলটি লক থাকে না))
  4. সারিটি sertedোকানো হয়েছে।
  5. লেনদেন প্রতিশ্রুতিবদ্ধ (সম্ভবত পরে বেশিরভাগ সময় পরে), তাই লকটি আবার সরানো হবে।

আমি মনে করি 2 থেকে 3 ধাপের মধ্যে খুব ছোট উইন্ডো রয়েছে যেখানে

  • সমবর্তী অধিবেশন পরবর্তী পরিচয় মান (এক্স + 1) উত্পন্ন করতে পারে এবং অবশিষ্ট সমস্ত পদক্ষেপগুলি কার্যকর করতে পারে,
  • এইভাবে পাঠককে ঠিক সেই সময়ে X + 1 মান পড়ার সুযোগ দেয়, এক্স এর মানটি মিস করে missing

অবশ্যই, এর সম্ভাবনা অত্যন্ত কম বলে মনে হয়; কিন্তু এখনও - এটি ঘটতে পারে। বা এটা করতে পারে?

(যদি আপনি এই প্রসঙ্গে আগ্রহী হন: এটি হল নেভেনস্টোরের এসকিউএল পার্সিস্ট্যান্স ইঞ্জিনের বাস্তবায়ন N NEVESTore একটি অ্যাপেন্ড-একমাত্র ইভেন্ট স্টোর প্রয়োগ করে যেখানে প্রতিটি ইভেন্টে একটি নতুন, আরোহী চেকপয়েন্ট ক্রম নম্বর পাওয়া যায় Cli ক্লায়েন্টরা চেকপয়েন্ট দ্বারা আদেশিত ইভেন্ট স্টোর থেকে ইভেন্টগুলি পড়েন সকল প্রকারের গণনা সম্পাদনের জন্য। চেকপয়েন্ট এক্স-এর সাথে একবার কোনও ইভেন্ট প্রক্রিয়া করা হয়ে গেলে, ক্লায়েন্টরা কেবলমাত্র "নতুন" ইভেন্টগুলি বিবেচনা করে, যেমন, চেকপয়েন্ট X + 1 এবং এরপরের ঘটনাগুলি বিবেচনা করে। অতএব, এটি অত্যাবশ্যক যে ইভেন্টগুলি কখনই এড়ানো যায় না, যেহেতু তাদের আর কখনও বিবেচনা করা হবে না I'm আমি বর্তমানে নির্ধারণের চেষ্টা করছি যে Identityবেসড চেকপয়েন্ট বাস্তবায়ন এই প্রয়োজনীয়তাটি পূরণ করে কিনা These এগুলি সঠিক এসকিউএল বিবৃতিগুলি ব্যবহৃত হয় : স্কিমা , লেখকের প্রশ্ন ,পাঠকের প্রশ্ন ।)

আমি যদি সঠিক হয়ে থাকি এবং উপরে বর্ণিত পরিস্থিতি উত্থাপিত হতে পারে তবে আমি তাদের সাথে ডিলের মাত্র দুটি বিকল্প দেখতে পাচ্ছি, উভয়ই অসন্তুষ্টিজনক:

  • এক্স দেখার পূর্বে একটি চেকপয়েন্টের সিকোয়েন্স মান X + 1 দেখার সময়, এক্স + 1 খারিজ করুন এবং পরে আবার চেষ্টা করুন। তবে, Identityঅবশ্যই ফাঁক তৈরি করতে পারে (যেমন, যখন লেনদেনটি ফিরিয়ে দেওয়া হয়), এক্স কখনই আসতে পারে না।
  • সুতরাং, একই পদ্ধতির, তবে n মিলিসেকেন্ডের পরে ব্যবধানটি গ্রহণ করুন। যাইহোক, আমি এন এর কোন মান ধরে নেওয়া উচিত?

আরও ভাল ধারণা?


আপনি কি পরিচয়ের পরিবর্তে সিকোয়েন্স ব্যবহার করার চেষ্টা করেছেন? পরিচয়ের সাথে, আমি মনে করি না আপনি নির্ভরযোগ্যভাবে পূর্বাভাস দিতে পারেন কোন সন্নিবেশটি একটি নির্দিষ্ট পরিচয় মান পাবে তবে এটি সিকোয়েন্স ব্যবহার করে সমস্যা হওয়া উচিত নয়। অবশ্যই এটি এখন আপনার জিনিসগুলি কীভাবে পরিবর্তন করে তা পরিবর্তন করে।
এন্টোইন হার্নান্দেজ

@ সোলডিবাগ্যুয়াই কি আমার উপরের বর্ণিত রেস শর্তটি আরও সম্ভবত সম্ভাব্য করবে না? আমি একটি নতুন সিকোয়েন্স মান এক্স উত্পাদন করি (উপরে পদক্ষেপ 2 প্রতিস্থাপন), তারপরে একটি সারি প্রবেশ করান (পদক্ষেপ 3 এবং 4)। 2 এবং 3 এর মধ্যে এমন সম্ভাবনা রয়েছে যে অন্য কেউ পরবর্তী সিকোয়েন্স মান X + 1 তৈরি করতে পারে, তা প্রতিশ্রুতি দেয় এবং পাঠক সিক্যেন্স ভ্যালু এক্স এর সাথে আমার সারিটি সন্নিবেশ করার আগেই এই মানটি X + 1 পড়েন
ফ্যাবিয়ান শ্মিড

উত্তর:


26

একটি সারি সন্নিবেশ করার সময়, ক্লাস্টারড ইনডেক্সে একটি নতুন পরিচয় মান উত্পন্ন করার সময় এবং সংশ্লিষ্ট সারি কীটি লক করার মধ্যে সুযোগের একটি উইন্ডো রয়েছে, যেখানে কোনও বহিরাগত পর্যবেক্ষক একত্রে লেনদেনের মাধ্যমে সজ্জিত নতুন পরিচয় মান দেখতে পাবে?

হ্যাঁ।

পরিচয় মূল্যবোধের বরাদ্দ ধারণকারী ব্যবহারকারী লেনদেনের স্বাধীন । এটি একটি কারণ যা হ'ল লেনদেনটি ফিরিয়ে দেওয়া হলেও পরিচয় মানগুলি গ্রাস করা হয়। ইনক্রিমেন্ট অপারেশন নিজেই দুর্নীতি রোধ করার জন্য একটি ল্যাচ দ্বারা সুরক্ষিত, তবে এটি সুরক্ষার পরিমাণ।

আপনার প্রয়োগের নির্দিষ্ট পরিস্থিতিতে, সন্নিবেশের জন্য ব্যবহারকারীর লেনদেন এমনকি সক্রিয় করার আগে পরিচয় বরাদ্দ (একটি কল CMEDSeqGen::GenerateNewValue) করা হয় (এবং কোনও তালা নেওয়ার আগে)।

সনাক্তকরণের মান বৃদ্ধি এবং বরাদ্দের ঠিক পরে আমাকে একটি থ্রেড হিমায়িত করার জন্য সংযুক্ত ডিবাগারের সাথে একযোগে দুটি সন্নিবেশ চালিয়ে আমি একটি দৃশ্যের পুনরুত্পাদন করতে সক্ষম হয়েছি যেখানে:

  1. সেশন 1 একটি পরিচয় মান অর্জন করে (3)
  2. সেশন 2 একটি পরিচয় মান অর্জন করে (4)
  3. সেশন 2 এটি সন্নিবেশ করায় এবং কমিট করে (সুতরাং সারি 4 সম্পূর্ণ দৃশ্যমান)
  4. সেশন 1 এর সন্নিবেশ সম্পাদন করে এবং কমিট করে (সারি 3)

পদক্ষেপ 3 পরে, প্রতিশ্রুতিবদ্ধ লকিংয়ের অধীনে সারি_নাম্বার ব্যবহার করে এমন একটি কোয়েরি নিম্নলিখিতটি ফিরিয়ে দিয়েছে:

স্ক্রিনশট

আপনার প্রয়োগে, এর ফলে চেকপয়েন্ট আইডি 3 ভুলভাবে এড়ানো যাবে।

অপশক্তিটির উইন্ডো তুলনামূলকভাবে ছোট, তবে এটি বিদ্যমান। ডিবাগারটি সংযুক্ত করার চেয়ে আরও বাস্তবসম্মত দৃশ্যাবলী দেওয়ার জন্য: একটি নির্বাহী ক্যোয়ারী থ্রেড উপরের 1 ধাপ পরে সময়সূচী অর্জন করতে পারে। মূল থ্রেডটি সন্নিবেশ সম্পাদন করতে পুনরায় শুরু করার আগে এটি দ্বিতীয় থ্রেডকে একটি পরিচয় মান বরাদ্দ করতে, সন্নিবেশ এবং প্রতিশ্রুতি দেয়।

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

মৌলিকভাবে, ডকুমেন্টের চেয়ে পরিচয়ের মানগুলির আশেপাশে আর কোনও গ্যারান্টি নেই :

  • প্রতিটি নতুন মান বর্তমান বীজ এবং বর্ধনের উপর ভিত্তি করে উত্পন্ন হয়।
  • নির্দিষ্ট লেনদেনের জন্য প্রতিটি নতুন মান টেবিলের অন্যান্য সমবর্তী লেনদেনের থেকে পৃথক।

সত্যিই এটি।

যদি কঠোর লেনদেনের ফিফো প্রক্রিয়াকরণ প্রয়োজন হয়, আপনার ম্যানুয়ালি সিরিয়ালাইজ করা ছাড়া আপনার কাছে সম্ভবত বিকল্প নেই choice যদি অ্যাপ্লিকেশনটির কম প্রয়োজন হয় তবে আপনার কাছে আরও বিকল্প রয়েছে। প্রশ্নটি এই ক্ষেত্রে 100% পরিষ্কার নয় clear তবুও, আপনি সারণী হিসাবে টেবিলগুলি ব্যবহার করে রেমাস রুসানুর নিবন্ধে কিছু দরকারী তথ্য পেতে পারেন ।


7

পল হোয়াইট যেমন একেবারে সঠিক উত্তর দিয়েছেন তেমন অস্থায়ীভাবে "এড়িয়ে যাওয়া" পরিচয় সারিগুলির সম্ভাবনা রয়েছে। আপনার নিজের জন্য এই কেসটি পুনরুত্পাদন করার জন্য এখানে কোডের একটি ছোট্ট অংশ।

একটি ডাটাবেস এবং একটি পরীক্ষাযোগ্য তৈরি করুন:

create database IdentityTest
go
use IdentityTest
go
create table dbo.IdentityTest (ID int identity, c1 char(10))
create clustered index CI_dbo_IdentityTest_ID on dbo.IdentityTest(ID)

সি # কনসোল প্রোগ্রামে এই টেবিলটিতে সমবর্তী প্রবেশ এবং নির্বাচনগুলি সম্পাদন করুন:

using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Threading;

namespace IdentityTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var insertThreads = new List<Thread>();
            var selectThreads = new List<Thread>();

            //start threads for infinite inserts
            for (var i = 0; i < 100; i++)
            {
                insertThreads.Add(new Thread(InfiniteInsert));
                insertThreads[i].Start();
            }

            //start threads for infinite selects
            for (var i = 0; i < 10; i++)
            {
                selectThreads.Add(new Thread(InfiniteSelectAndCheck));
                selectThreads[i].Start();
            }
        }

        private static void InfiniteSelectAndCheck()
        {
            //infinite loop
            while (true)
            {
                //read top 2 IDs
                var cmd = new SqlCommand("select top(2) ID from dbo.IdentityTest order by ID desc")
                {
                    Connection = new SqlConnection("Server=localhost;Database=IdentityTest;Integrated Security=SSPI;Application Name=IdentityTest")
                };

                try
                {
                    cmd.Connection.Open();
                    var dr = cmd.ExecuteReader();

                    //read first row
                    dr.Read();
                    var row1 = int.Parse(dr["ID"].ToString());

                    //read second row
                    dr.Read();
                    var row2 = int.Parse(dr["ID"].ToString());

                    //write line if row1 and row are not consecutive
                    if (row1 - 1 != row2)
                    {
                        Console.WriteLine("row1=" + row1 + ", row2=" + row2);
                    }
                }
                finally
                {
                    cmd.Connection.Close();
                }
            }
        }

        private static void InfiniteInsert()
        {
            //infinite loop
            while (true)
            {
                var cmd = new SqlCommand("insert into dbo.IdentityTest (c1) values('a')")
                {
                    Connection = new SqlConnection("Server=localhost;Database=IdentityTest;Integrated Security=SSPI;Application Name=IdentityTest")
                };

                try
                {
                    cmd.Connection.Open();
                    cmd.ExecuteNonQuery();
                }
                finally
                {
                    cmd.Connection.Close();
                }
            }
        }
    }
}

এই কনসোলটি প্রতিটি ক্ষেত্রে একটি লাইন মুদ্রণ করে যখন পড়া থ্রেডগুলির মধ্যে একটিতে "প্রবেশ" মিস হয়।


1
দুর্দান্ত কোড তবে আপনি কেবল পরপর আইডির জন্য পরীক্ষা করুন ( "// সারি 1 এবং সারি যদি ধারাবাহিক না হয় তবে" রাইটিং লাইন " )। আপনার কোড মুদ্রিত হবে এমন ফাঁকগুলি তৈরি হতে পারে। এর অর্থ এই নয় যে এই ফাঁকগুলি পরে পূরণ করা হবে।
ypercubeᵀᴹ

1
কোডটি এমন IDENTITYদৃশ্যে ট্রিগার দেয় না যেখানে ফাঁক তৈরি হবে (যেমন কোনও লেনদেনকে পিছনে ফেলা), মুদ্রিত লাইনগুলি প্রকৃতপক্ষে "এড়িয়ে যাওয়া" মানগুলি দেখায় (বা কমপক্ষে তারা যখন আমি আমার মেশিনে দৌড়ে গিয়ে তা পরীক্ষা করেছিলাম)। খুব সুন্দর রেপুর নমুনা!
ফ্যাবিয়ান শমিড

5

পরিচয়গুলি ধারাবাহিকভাবে প্রত্যাশা না করাই ভাল কারণ এমন অনেক পরিস্থিতিতে রয়েছে শূন্যস্থান ছেড়ে যেতে পারে। বিমূর্ত সংখ্যার মতো পরিচয় বিবেচনা করা এবং এর সাথে কোনও ব্যবসায়িক অর্থ সংযুক্ত না করা ভাল।

মূলত, আপনি যদি INSERT অপারেশনগুলি (বা স্পষ্টভাবে সারিগুলি মুছে ফেলুন) রোল করেন তবে ফাঁকগুলি দেখা দিতে পারে এবং আপনি যদি সারণীর সম্পত্তি পরিচয় পরিচয়পরিবর্তনটি সেট করে থাকেন তবে সদৃশগুলি ঘটতে পারে।

গ্যাপগুলি ঘটতে পারে যখন:

  1. রেকর্ড মুছে ফেলা হয়।
  2. একটি নতুন রেকর্ড sertোকানোর চেষ্টা করার সময় একটি ত্রুটি ঘটেছে (রোলড ব্যাকড)
  3. সুস্পষ্ট মান সহ একটি আপডেট / সন্নিবেশ (পরিচয়_সাইন্ট বিকল্প)।
  4. বর্ধিত মান 1 এরও বেশি।
  5. একটি লেনদেন পিছনে ফিরে।

একটি কলামে পরিচয় সম্পত্তি গ্যারান্টি দেয় না:

• অনন্যতা

Transaction লেনদেনের মধ্যে ধারাবাহিক মান। মানগুলি যদি ক্রমাগত হতে হয় তবে লেনদেনের ক্ষেত্রে টেবিলের একচেটিয়া লক ব্যবহার করা উচিত বা সিরিয়ালিজেবল বিচ্ছিন্নতা স্তরটি ব্যবহার করা উচিত।

Server সার্ভার পুনরায় আরম্ভের পরে ধারাবাহিক মান।

Values ​​মানগুলির পুনরায় ব্যবহার।

আপনি যদি এর কারণে পরিচয় মানগুলি ব্যবহার করতে না পারেন তবে একটি বর্তমান মান সম্বলিত একটি পৃথক টেবিল তৈরি করুন এবং আপনার অ্যাপ্লিকেশনের সাথে টেবিল এবং নম্বর নির্ধারণের অ্যাক্সেস পরিচালনা করুন। এর কার্যকারিতা প্রভাবিত করার সম্ভাবনা রয়েছে have

https://msdn.microsoft.com/en-us/library/ms186775(v=sql.105).aspx
https://msdn.microsoft.com/en-us/library/ms186775(v=sql.110) .aspx


আমি মনে করি শূন্যস্থানগুলি আমার প্রাথমিক সমস্যা নয় - আমার মূল সমস্যাটি হ'ল মূল্যবোধের আরোহণ vis (অর্থাত্, বলুন, পরিচয় মান 7 অবশ্যই পরিচয়ের মান identity হওয়ার আগে সেই মান অনুসারে কোনও প্রশ্নের ক্রমটি পর্যবেক্ষণযোগ্য হবে না))
ফ্যাবিয়ান শমিয়েড

1
আমি দেখেছি পরিচয় মান মত কমিট: 1, 2, 5, 3, 4
stacylaray

অবশ্যই, এটি সহজেই পুনরুত্পাদনযোগ্য, যেমন লেনার্টের উত্তর থেকে দৃশ্যটি ব্যবহার করে using যে প্রশ্নটির সাথে আমি লড়াই করছি তার মধ্যে আমি যদি কোনও ক্লজ (যা ক্লাস্টারড ইনডেক্সের ক্রম হিসাবে ঘটে) ব্যবহার করে কোনও জিজ্ঞাসা ব্যবহার করার সময় আমি সেই প্রতিশ্রুতিবদ্ধ আদেশটি পর্যবেক্ষণ করতে পারি কিনা ORDER BY CheckpointSequence। আমি মনে করি যে এটির আইডেন্টিটির প্রজন্ম কোনওভাবেই INSERT বিবৃতিতে গৃহীত তালার সাথে যুক্ত কিনা, বা যদি এইগুলি এসকিউএল সার্ভারের দ্বারা একের পর এক সম্পাদিত দুটি অপ্রাসঙ্গিক ক্রিয়া হয় তবে এই প্রশ্নের উত্থান হয়।
ফ্যাবিয়ান শমিয়েড

1
প্রশ্ন কি? যদি পড়ার প্রতিশ্রুতি থাকে তবে, উদাহরণস্বরূপ, আদেশ অনুসারে 1, 2, 3, 5 দেখানো হবে কারণ তারা প্রতিশ্রুতিবদ্ধ হয়েছে এবং 4 এর অর্থ নোংরা পাঠ্য নয় read এছাড়াও, এনভেস্টস্টোর সম্পর্কে আপনার ব্যাখ্যাতে বলা হয়েছে "অতএব, ঘটনাটি কখনই এড়ানো উচিত নয়, কারণ এগুলি আবার কখনও বিবেচনা করা হবে না।"
স্ট্যাসিলারায়

ক্যোয়ারী উপরে দেওয়া হয়েছে ( gist.github.com/fschmied/47f716c32cb64b852f90 ) - এটি পৃষ্ঠাযুক্ত , তবে একটি সহজ থেকে সিদ্ধ হয়SELECT ... FROM Commits WHERE CheckpointSequence > ... ORDER BY CheckpointSequence । আমি মনে করি না এই ক্যোয়ারীটি লক করা সারির 4টি পড়বে, বা এটি হবে? (আমার পরীক্ষায়, যখন
ক্লোয়ারটি

1

আমার সন্দেহ হয় যে এটি সার্ভারের ভারী বোঝা থাকা অবস্থায় সমস্যাগুলি, সমস্যাগুলি আরও খারাপ হতে পারে। দুটি লেনদেন বিবেচনা করুন:

  1. টি 1: টিতে sertোকান ... - 5 টি 5োকান বলে get
  2. টি 2: টিতে sertোকান ... - 6 inোকান বলে say
  3. টি 2: কমিট
  4. পাঠক দেখেন 6 তবে 5 নয়
  5. টি 1: কমিট

উপরের দৃশ্যে আপনার LAST_READ_ID be হবে, সুতরাং 5 টি আর পড়বে না।


আমার পরীক্ষাগুলি থেকে বোঝা যাচ্ছে যে এই দৃশ্যটি কোনও সমস্যা নয় কারণ পাঠক (পদক্ষেপ 4) ব্লক করবে (টি 1 এর লকগুলি প্রকাশ না করা পর্যন্ত) যখন এটি 5 টির সাথে সারিটি পড়ার চেষ্টা করে তবে আমি কি কিছু হারিয়ে ফেলছি?
ফ্যাবিয়ান শমিয়েড

আপনি ঠিক থাকতে পারেন, আমি এসকিউএল সার্ভারে লকিং প্রক্রিয়াটি ভালভাবে জানি না (তাই আমি আমার উত্তরে সন্দেহ করি)।
লেনার্ট

পাঠকের বিচ্ছিন্নতা স্তরের উপর নির্ভর করে। এটি আমার উভয়ই দেখতে, ব্লক করতে বা দেখতে কেবল 6..
মাইকেল গ্রিন

0

এই স্ক্রিপ্টটি চলছে:

BEGIN TRAN;
INSERT INTO dbo.Example DEFAULT VALUES;
COMMIT;

বর্ধিত ইভেন্ট অধিবেশন দ্বারা ক্যাপচার করা হিসাবে আমি লকগুলি অর্জিত এবং প্রকাশিত দেখছি তার নীচে:

name            timestamp                   associated_object_id    mode    object_id   resource_type   session_id  resource_description
lock_acquired   2016-03-29 06:37:28.9968693 1585440722              IX      1585440722  OBJECT          51          
lock_acquired   2016-03-29 06:37:28.9969268 7205759890195415040     IX      0           PAGE            51          1:1235
lock_acquired   2016-03-29 06:37:28.9969306 7205759890195415040     RI_NL   0           KEY             51          (ffffffffffff)
lock_acquired   2016-03-29 06:37:28.9969330 7205759890195415040     X       0           KEY             51          (29cf3326f583)
lock_released   2016-03-29 06:37:28.9969579 7205759890195415040     X       0           KEY             51          (29cf3326f583)
lock_released   2016-03-29 06:37:28.9969598 7205759890195415040     IX      0           PAGE            51          1:1235
lock_released   2016-03-29 06:37:28.9969607 1585440722              IX      1585440722  OBJECT          51      

নতুন সারি তৈরি হওয়ার জন্য এক্স কী লক হওয়ার আগেই অর্জিত RI_N KEY লকটি নোট করুন Note এই স্বল্প-স্থায়ী পরিসীমা লকটি আরআইআরএন কেই লকটি সামঞ্জস্যভাবে সন্নিবেশ করা থেকে বিরত করবে যেহেতু আরআই_এন লকগুলি অসম্পূর্ণ। আপনি দ্বিতীয় এবং 3 ধাপের মধ্যে উল্লিখিত উইন্ডোটি উদ্বেগের বিষয় নয় কারণ সদ্য উত্পন্ন কীটিতে সারি লক হওয়ার আগেই রেঞ্জ লকটি অর্জিত হয়েছে।

আপনার SELECT...ORDER BYসদ্য সন্নিবেশ করা সারিগুলির আগে যতক্ষণ আপনার স্ক্যান শুরু হয়, READ COMMITTEDততক্ষণ আমি ডাটাবেস READ_COMMITTED_SNAPSHOTবিকল্পটি বন্ধ না হওয়া অবধি ডিফল্ট বিচ্ছিন্নতার স্তরে আপনার পছন্দসই আচরণটি আশা করব ।


1
মতে technet.microsoft.com/en-us/library/... সঙ্গে দুই কেশ RangeI_Nহয় সামঞ্জস্যপূর্ণ , অর্থাত্, একে অপরের ব্লক না (লক একটি বিদ্যমান serializable পাঠক উপর ব্লক জন্য বেশিরভাগ আছে)।
ফ্যাবিয়ান শমিয়েড

পছন্দ করুন এই বিষয়টি টেকনেট.মাইক্রোসফটি.এইন.ইউএস / লাইব্রেরি /ms186396(v=sql.105).aspx- এ লক সামঞ্জস্যের ম্যাট্রিক্সের সাথে দ্বন্দ্ব করে , যা দেখায় যে লকগুলি সামঞ্জস্যপূর্ণ নয়। আপনি উল্লিখিত লিঙ্কটিতে সন্নিবেশ করানোর উদাহরণটি আমার উত্তরে ট্রেসে যেমন দেখানো হয়েছে তেমন আচরণ করে (একচেটিয়া কী লকের আগে পরিসর পরীক্ষা করার জন্য স্বল্প-কালীন সন্নিবেশ রেঞ্জ লক)।
ড্যান গুজম্যান

1
প্রকৃতপক্ষে, ম্যাট্রিক্স "বিবাদবিরোধী নয়" ("সামঞ্জস্যপূর্ণ নয়") জন্য "এন" বলেছেন :)
ফ্যাবিয়ান শমিয়েড

0

এসকিউএল সার্ভার সম্পর্কে আমার বোঝার থেকে দ্বিতীয় ক্যোয়ারীর জন্য ডিফল্ট আচরণটি প্রথম ক্যোয়ারীর প্রতিশ্রুতি না দেওয়া পর্যন্ত কোনও ফলাফল প্রদর্শন করবে না। যদি প্রথম ক্যোয়ারী কমিটের পরিবর্তে রোলব্যাক করে তবে আপনার কলামে আপনার একটি অনুপস্থিত আইডি থাকবে।

বেসিক কনফিগারেশন

ডাটাবেস সারণী

আমি নিম্নলিখিত কাঠামো সহ একটি ডাটাবেস টেবিল তৈরি করেছি:

CREATE TABLE identity_rc_test (
    ID4VALUE INT IDENTITY (1,1), 
    TEXTVALUE NVARCHAR(20),
    CONSTRAINT PK_ID4_VALUE_CLUSTERED 
        PRIMARY KEY CLUSTERED (ID4VALUE, TEXTVALUE)
)

ডাটাবেস বিচ্ছিন্নতা স্তর

আমি নিম্নলিখিত বিবৃতি দিয়ে আমার ডাটাবেসের বিচ্ছিন্নতা স্তরটি পরীক্ষা করেছি:

SELECT snapshot_isolation_state, 
       snapshot_isolation_state_desc, 
       is_read_committed_snapshot_on
FROM sys.databases WHERE NAME = 'mydatabase'

যা আমার ডাটাবেসের জন্য নিম্নলিখিত ফলাফলটি ফিরিয়ে দিয়েছে:

snapshot_isolation_state    snapshot_isolation_state_desc   is_read_committed_snapshot_on
0                           OFF                             0

(এটি এসকিউএল সার্ভার ২০১২-এ একটি ডাটাবেসের জন্য ডিফল্ট সেটিংস)

স্ক্রিপ্ট পরীক্ষা করুন

নিম্নলিখিত স্ক্রিপ্টগুলি স্ট্যান্ডার্ড এসকিউএল সার্ভার এসএসএমএস ক্লায়েন্ট সেটিংস এবং মানক এসকিউএল সার্ভার সেটিংস ব্যবহার করে কার্যকর করা হয়েছিল।

ক্লায়েন্ট সংযোগ সেটিংস

ক্লায়েন্টটি এসএমএসে READ COMMITTEDক্যোয়ারী বিকল্প অনুযায়ী লেনদেনের বিচ্ছিন্নতা স্তরটি ব্যবহার করতে সেট করা হয়েছে ।

প্রশ্ন ঘ

নিম্নলিখিত জিজ্ঞাসাটি এসপিআইডি 57 এর সাথে একটি ক্যোয়ারী উইন্ডোতে কার্যকর করা হয়েছিল

SELECT * FROM dbo.identity_rc_test
BEGIN TRANSACTION [FIRST_QUERY]
INSERT INTO dbo.identity_rc_test (TEXTVALUE) VALUES ('Nine')
/* Commit is commented out to prevent the INSERT from being commited
--COMMIT TRANSACTION [FIRST_QUERY]
--ROLLBACK TRANSACTION [FIRST_QUERY]
*/

প্রশ্ন 2

নিম্নলিখিত ক্যোয়ারী এসপিআইডি 58 এর সাথে একটি ক্যোয়ারী উইন্ডোতে কার্যকর করা হয়েছিল

BEGIN TRANSACTION [SECOND_QUERY]
INSERT INTO dbo.identity_rc_test (TEXTVALUE) VALUES ('Ten')
COMMIT TRANSACTION [SECOND_QUERY]
SELECT * FROM dbo.identity_rc_test

ক্যোয়ারীটি সম্পন্ন হয় নি এবং কোনও পৃষ্ঠায় এক্সক্লুসিভ লকটি প্রকাশের অপেক্ষায় রয়েছে।

লকিং নির্ধারণের জন্য স্ক্রিপ্ট

এই স্ক্রিপ্টটি দুটি লেনদেনের জন্য ডাটাবেস অবজেক্টগুলিতে লকিংটি প্রদর্শন করে:

SELECT request_session_id, resource_type,
       resource_description, 
       resource_associated_entity_id,
       request_mode, request_status
FROM sys.dm_tran_locks
WHERE request_session_id IN (57, 58)

এবং ফলাফল এখানে:

58  DATABASE                    0                   S   GRANT
57  DATABASE                    0                   S   GRANT
58  PAGE            1:79        72057594040549300   IS  GRANT
57  PAGE            1:79        72057594040549300   IX  GRANT
57  KEY         (a0aba7857f1b)  72057594040549300   X   GRANT
58  KEY         (a0aba7857f1b)  72057594040549300   S   WAIT
58  OBJECT                      245575913           IS  GRANT
57  OBJECT                      245575913           IX  GRANT

ফলাফলগুলি দেখায় যে ক্যোরি উইন্ডো ওয়ান (এসপিআইডি 57) এর ডেটাবাসে একটি শেয়ারড লক (এস) রয়েছে ওবিজেইসিটি-তে একটি ইনটেন্ডেড এক্সএক্লুসিভ (আইএক্স) লক, এটি সন্নিবেশ করতে চায় এমন পৃষ্ঠায় একটি উদ্দিষ্ট এক্সক্লুসিভ (আইএক্স) লক এবং একটি এক্সক্লুসিভ KEY এ লক (এক্স) এটি hasোকানো হয়েছে, তবে এখনও প্রতিশ্রুতিবদ্ধ নয়।

অননুমোদিত তথ্যের কারণে, দ্বিতীয় ক্যোয়ারির (এসপিআইডি 58) ডেটাবাস স্তরটিতে একটি ভাগ করা লক (এস) রয়েছে, ওবিজেইসিটি-তে একটি ইনটেন্ডেড শেয়ার্ড (আইএস) লক রয়েছে, পৃষ্ঠায় একটি শেয়ারড (এস) লক করা আছে একটি শেয়ারড (এস) ) অনুরোধের স্থিতি ওয়েট দিয়ে কেই-তে লক করুন।

সারাংশ

প্রথম ক্যোয়ারী উইন্ডোতে কোয়েরি বিনা প্রতিশ্রুতি ছাড়াই কার্যকর করে। কারণ দ্বিতীয় ক্যোয়ারি কেবলমাত্র READ COMMITTEDডেটা করতে পারে এটি হয় সময়সীমা না হওয়া পর্যন্ত বা প্রথম ক্যোয়ারীতে লেনদেনের প্রতিশ্রুতি না দেওয়া পর্যন্ত অপেক্ষা করে।

এটি আমার মাইক্রোসফ্ট এসকিউএল সার্ভারের ডিফল্ট আচরণ বুঝতে পেরেছিল।

আপনার পর্যবেক্ষণ করা উচিত যে আইডিটি প্রথম বিবৃতিটি যদি কমিট করে তবে সেলেক্ট স্টেটমেন্টের পরবর্তী পাঠগুলির জন্য যথাযথ অনুক্রম।

যদি প্রথম বিবৃতিটি রোলব্যাক করে তবে আপনি ক্রমটিতে একটি অনুপস্থিত আইডি পাবেন, তবে এখনও আইডির সাথে আরোহী ক্রমে (আপনি আইডি কলামে ডিফল্ট বা ASC বিকল্পের সাহায্যে INDEX তৈরি করেছেন)।

হালনাগাদ:

(কথায় কথায়) হ্যাঁ, আপনি কোনও সমস্যার মুখোমুখি না হওয়া পর্যন্ত আপনি সঠিকভাবে পরিচয় কলামের কাজ করাতে নির্ভর করতে পারেন। মাইক্রোসফ্টের ওয়েবসাইটে এসকিউএল সার্ভার 2000 এবং পরিচয় কলাম সম্পর্কিত একটিই হটফিক্স রয়েছে

আপনি যদি সঠিকভাবে পরিচয় কলাম আপডেট করার উপর নির্ভর করতে না পারেন তবে আমার মতে মাইক্রোসফ্টের ওয়েবসাইটে আরও হটফিক্স বা প্যাচ থাকবে।

আপনার যদি মাইক্রোসফ্ট সাপোর্ট কন্ট্রাক্ট থাকে তবে আপনি সর্বদা একটি অ্যাডভাইসরি কেস খুলতে এবং অতিরিক্ত তথ্য চাইতে পারেন।


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

না আপনি বিবৃতিগুলি থামাতে পারবেন না, তবে আমার (ধীর) পর্যবেক্ষণটি দ্রুত / স্বাভাবিক ভিত্তিতে ঘটে। যত তাড়াতাড়ি একটি এসপিআইডি তথ্য inোকানোর জন্য একটি লকটি অর্জন করবে, অন্যটি একই লকটি অর্জন করতে অক্ষম হবে। দ্রুত বিবৃতিটি ইতিমধ্যে লক এবং আইডি ক্রমানুসারে অর্জন করার সুবিধা পাবে। লকটি প্রকাশের পরে পরবর্তী বিবৃতিটি পরবর্তী আইডিটি গ্রহণ করবে।
জন ওরফে হট 2 ইউজ

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