আমি কীভাবে একবারে একজনের দ্বারা চালিত এসকিউএল সঞ্চিত পদ্ধতিটিকে সীমাবদ্ধ করব?


12

আমার কাছে একটি সঞ্চিত প্রক্রিয়া রয়েছে যা মূলত একটি টেবিল থেকে মানগুলি নির্বাচন করে এবং সেগুলিতে অন্যটিতে সন্নিবেশ করে, এক ধরণের সংরক্ষণাগার। আমি একই সময়ে একাধিক লোককে তা করতে এড়াতে চাই।

এই প্রক্রিয়াটি চলাকালীন, আমি চাই না যে অন্য কেউ এটি শুরু করতে সক্ষম হন, তবে আমি সিরিয়ালাইজেশন চাই না, অন্যটি ব্যক্তি এটি সম্পন্ন করার পরে প্রক্রিয়াটি চালাবেন।

আমি যে প্রক্রিয়াটি চালাচ্ছি তার সময় অন্য ব্যক্তির জন্য এটিটি চেষ্টা করার চেষ্টা করা হয় error

আমি sp_getapplock ব্যবহার করে চেষ্টা করেছি, তবে আমি প্রক্রিয়াটি চালানো থেকে ব্যক্তিটিকে পুরোপুরি আটকাতে পারি না।

আমি sys.dm_exec_requests এবং পদ্ধতিটি ব্লক করেও পদ্ধতিটি অনুসন্ধান করার চেষ্টা করেছি, যদিও এটি কাজ করে, আমি মনে করি এটি অনুকূল নয় কারণ কিছু সার্ভারে আমার কাছে sys.dm_exec_sql_text (sql_handle) চালানোর অনুমতি নেই।

আমার এটি করার সর্বোত্তম উপায় কী?


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

উত্তর:


15

@ টিবোর-করাসজির উত্তরে যুক্ত করতে, একটি লক টাইমআউট সেট করা আসলে ত্রুটি তৈরি করে না (আমি ডক্সের বিরুদ্ধে পিআর জমা দিয়েছি)। sp_getapplock সবেমাত্র -1 প্রদান করে, তাই আপনাকে ফেরতের মানটি পরীক্ষা করতে হবে। সুতরাং এটি পছন্দ:

create or alter procedure there_can_be_only_one 
as
begin
begin transaction

  declare @rv int
  exec @rv = sp_getapplock 'only_one','exclusive','Transaction',0
  if @rv < 0
   begin
      throw 50001, 'There is already an instance of this procedure running.', 10
   end

  --do stuff
  waitfor delay '00:00:20'


commit transaction
end

8

প্রোকের শুরুতে sp_getapplock ব্যবহার করুন এবং খুব কম মানকে একটি লক টাইমআউট সেট করুন। আপনি অবরুদ্ধ হয়ে যাওয়ার পরে আপনি একটি ত্রুটি পান।


7

আর একটি বিকল্প পদ্ধতিতে অ্যাক্সেস নিয়ন্ত্রণ করতে একটি টেবিল তৈরি করা। নীচের উদাহরণে একটি সম্ভাব্য সারণী পাশাপাশি একটি পদ্ধতি যা এটি ব্যবহার করতে পারে তা দেখায়।

CREATE TABLE dbo.ProcedureLock
    (
    ProcedureLockID INT NOT NULL IDENTITY(1,1)
    , ProcedureName SYSNAME NOT NULL
    , IsLocked BIT NOT NULL CONSTRAINT DF_ProcedureLock_IsLocked DEFAULT (0)
    , UserSPID INT NULL
    , DateLockTaken DATETIME2(7) NULL
    , DateLockExpires DATETIME2(7) NULL
    , CONSTRAINT PK_ProcedureLock PRIMARY KEY CLUSTERED (ProcedureLockID)
    )

CREATE UNIQUE NONCLUSTERED INDEX IDXUQ_ProcedureLock_ProcedureName
    ON dbo.ProcedureLock (ProcedureName)

INSERT INTO dbo.ProcedureLock
    (ProcedureName, IsLocked)
VALUES ('dbo.DoSomeWork', 0)

GO

CREATE PROCEDURE dbo.DoSomeWork
AS
BEGIN

    /** Take Lock */
    UPDATE dbo.ProcedureLock
    SET IsLocked = 1
        , UserSPID = @@SPID
        , DateLockTaken = SYSDATETIME()
        , DateLockExpires = DATEADD(MINUTE, 10, SYSDATETIME())
    WHERE ProcedureName = 'dbo.DoSomeWork'
        AND (IsLocked = 0
            OR (IsLocked = 1 AND DateLockExpires < SYSDATETIME())
            )

    IF COALESCE(@@ROWCOUNT, 0) = 0
    BEGIN
        ;THROW 50000, 'This procedure can only be run one at a time, please wait', 1;
    END

    /** DO WHATEVER NEEDS TO BE DONE */

    /** Release the lock */
    UPDATE dbo.ProcedureLock
    SET IsLocked = 0
        , UserSPID = NULL
        , DateLockTaken = NULL
        , DateLockExpires = NULL
    WHERE ProcedureName = 'dbo.DoSomeWork'

END

1
প্রশ্নটি পড়ার পরে আমি যা ভাবছিলাম তা এটির সাথে খুব মিল (বা সম্ভবত এটির মতো) তবে আমার এই ধারণাটি নিয়ে একটি সমস্যা ছিল যে আমি কীভাবে সম্বোধন করব তা পুরোপুরি নিশ্চিত নই এবং এটি আপনার উত্তরে সম্বোধন করতেও পারছি না পারেন। আমার উদ্বেগ হ'ল, "কিছু করা দরকার যা করে" অংশের সময় কিছু ঘটে? সেক্ষেত্রে আপনি কীভাবে IsLockedরাজ্যে 0 তে পুনরায় সেট করবেন ? আমি আপনার COALESCEএখানে ব্যবহার সম্পর্কে আগ্রহী । @@ROWCOUNTমত বিবৃতি পরে নাল হতে পারে UPDATE? অবশেষে, কেবল একটি গৌণ নিতপিক, কেন THROWসেই নির্দিষ্ট ক্ষেত্রে বিবৃতিটির সামনে একটি সেমিকোলন রাখেন ?
অ্যান্ড্রি এম

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

-1

আমি মনে করি আপনি একটি ভুল উপায়ে সমস্যাটি সমাধান করার চেষ্টা করছেন। আপনি যা চান তা হ'ল ডাটাবেস ধারাবাহিকতার সর্বোচ্চ সুরক্ষা। যদি দু'জন ব্যক্তি একই সময়ে একটি সঞ্চিত প্রক্রিয়া চালায় তবে ডাটাবেসের ধারাবাহিকতা লঙ্ঘন হতে পারে।

বিভিন্ন ধরণের ডাটাবেসের অসঙ্গতি থেকে রক্ষা পেতে, এসকিউএল স্ট্যান্ডার্ডটিতে চারটি লেনদেনের বিচ্ছিন্নতা স্তর রয়েছে:

  • অজ্ঞাত পড়ুন যেখানে মূলত লেনদেনগুলি তাদের মূল্য হ্রাস করে, অন্যান্য লেনদেনগুলি নোংরা ডেটা দেখে। এটি ব্যবহার করবেন না!
  • সংস্থাগুলি পড়ুন যেখানে লেনদেনগুলি কেবল প্রতিশ্রুতিবদ্ধ ডেটা দেখতে পায়, তবে এমন অসঙ্গতি থাকতে পারে যেখানে দুটি লেনদেন একে অপরের পায়ের আঙ্গুলের উপর দিয়ে যেতে পারে
  • পুনঃপঠনযোগ্য পড়ুন যেখানে এক ধরণের অসঙ্গতি, পুনরাবৃত্তযোগ্য পাঠযোগ্য সমাধান করা হয়
  • সিরিয়ালযোগ্য যা গ্যারান্টি দেয় যে এখানে কিছু ভার্চুয়াল অর্ডার রয়েছে যাতে লেনদেনগুলি সম্পাদন করলে ফলাফল কার্যকর হতে পারে যে তাদের মৃত্যুদন্ড কার্যকর হয়েছিল

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

  • ভিত্তিক ডাটাবেস লক করার ক্ষেত্রে একইটি পড়ুন
  • SNAPSHOT IOLATION যেখানে ডাটাবেস সমস্ত ডেটার স্ন্যাপশট দেখতে পায় এবং যদি এটি কোনও সারি আপডেট করার চেষ্টা করে যা অন্য কোনও লেনদেন দ্বারা আপডেট করা হয়, তবে এটি বাতিল হয়ে যায়, তবুও এমন কিছু সুপরিচিত ব্যঙ্গি রয়েছে যা স্থান নিতে পারে
  • সিরিয়ালজ্যাবল যা ভিত্তিক ডাটাবেসগুলি লক করার মতো একই, তবে এবার আলাদাভাবে প্রয়োগ করা হয়েছে, তালা নিয়ে নয় তবে নিশ্চিত করা হয়েছে যে কোনও সিরিয়ালীকরণ লঙ্ঘন নেই এবং যদি এইরকম লঙ্ঘন ধরা পড়ে তবে লেনদেন বাতিল করে

এই স্ন্যাপশট বিচ্ছিন্নতা ভিত্তিক ডাটাবেসে লেনদেনের বাতিলগুলি উদ্বেগজনক মনে হতে পারে তবে আবার প্রতিটি একক ডাটাবেস একটি অচলাবস্থার কারণে একটি লেনদেন বাতিল করে দেবে, সুতরাং কোনও লেনদেন পুনরায় চেষ্টা করতে সক্ষম হওয়ার জন্য কোনও যুক্তিসঙ্গত অ্যাপ্লিকেশন প্রয়োজন needs

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

যদি স্ন্যাপশট বিচ্ছিন্ন ডাটাবেসে একটি সিরিয়ালিজেবল বিচ্ছিন্নতা স্তর ব্যবহার করা হয় , যদি দু'জন লোক একই সাথে স্টোরেজ প্রক্রিয়াটি চালানোর চেষ্টা করে এবং তারা একে অপরের পায়ের আঙ্গুলের উপর পদক্ষেপ নেয়, তবে একটি লেনদেন বাতিল হয়ে যাবে।

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

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


আমি এটিকে ডাউনওয়েট বলেছি যার অর্থ কেউ এসকিউএল সার্ভারের সিরিয়ালিজেবল বিচ্ছিন্নতা আছে কিনা তা তদন্ত করেছে এবং খুঁজে পেয়েছে যে এটি নেই।
juhist

-2

আমি বুঝতে পারি যে 'বাস্তব' সমস্যা আরও জটিল হতে পারে।

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

আশা করি যে সাহায্য করে,
-ক্রিস সি।


1
"তাত্ক্ষণিক" বলতে কী বোঝ? সঙ্গে সঙ্গে কী? Sertোকানোর পরে? সুতরাং কোনও নতুন সারি আসার সাথে সাথেই তা অবিলম্বে সংরক্ষণাগারটিতে প্রেরণ করা হবে? অথবা আপনি আপডেট পরে বোঝাতে চেয়েছিলেন? সুতরাং কোনও তথ্য পরিবর্তন আর্কাইভ ট্রিগার? আপনি যে দৃশ্যের বিষয়টি মনে করছেন সে সম্পর্কে আপনার আরও নির্দিষ্ট হওয়া উচিত।
অ্যান্ড্রি এম

সংরক্ষণাগারটি খুব ব্যয়বহুল এবং / অথবা খুব কমই প্রতিটি সন্নিবেশের জন্য মূল্যবান হতে আগ্রহী হতে পারে, বিশেষত যদি উত্স টেবিলটি প্রায়শই inোকানো হয় এবং / অথবা এর মধ্যে সংরক্ষণাগারটি এবং সংরক্ষণাগারটির জন্য ব্যয়বহুল তালার প্রয়োজন হয়।
আন্ডারস্কোর_ডি

@ মাউন্ডসর_ডি হ্যাঁ, এটি খুব ব্যয়বহুল হতে পারে বা সর্বদা প্রয়োজন হয় না। এই কারণেই আমি জবাব দিয়ে আমার উত্তরটি শুরু করেছিলাম the 'real' problem may be more complex। ঘটনাটি যা তা নয়, ট্রিগারগুলি একটি ভাল সমাধান। এছাড়াও এটি পরীক্ষা করা এবং বজায় রাখা সম্ভবত সহজ হবে কারণ এটি একটি কাস্টম সমাধানের পরিবর্তে ডাটাবেসের একটি বৈশিষ্ট্য।
জে ক্রিস কম্পটন 19

@ অ্যান্ড্রিএম আমি শব্দটি তাত্ক্ষণিকভাবে সরিয়ে দিয়েছি, ট্রিগারগুলি সন্নিবেশ / আপডেটের রেফের পরিবর্তে। বিভ্রান্তির জন্য দুঃখিত.
জে ক্রিস কমপটন

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