সঞ্চিত পদ্ধতির মাধ্যমে একটি টিএসকিউএল ক্রম অনুকরণ করুন


17

আমার কাছে একটি সঞ্চিত প্রক্রিয়া তৈরি করার প্রয়োজন রয়েছে যা একটি টিএসকিউএল অনুক্রমকে অনুকরণ করে। এটি হ'ল এটি প্রতিটি কলটিতে সর্বদা একটি বর্ধমান স্বতন্ত্র পূর্ণসংখ্যার মান দেয়। তদ্ব্যতীত, কোনও পূর্ণসংখ্যা যদি এতে পাস হয় তবে সেই মানটি ফেরত দেওয়া উচিত যদি এর আগে কোনও ফলাফল বৃহত্তর বা পরবর্তী সর্বোচ্চ পূর্ণসংখ্যার উপলব্ধ না হয়। এটি বলা ছাড়াই যায় যে একই সময়ে এই এসপিকে কল করার জন্য একাধিক ক্লায়েন্ট থাকতে পারে।

মেটাকি বারচার (সর্বাধিক) এবং মেইটভ্যালু লং বিগ আইটের কলামগুলির সাথে একটি সারণী মেটাআইএনফো দেওয়া হয়েছে। আশা করা যায় যে 'ইন্টারনাল-আইডি-লাস্ট' এর মেটাকি দিয়ে সারিটি নির্ধারিত সর্বশেষ সর্বোচ্চ মান ধারণ করবে। আমি নিম্নলিখিত সঞ্চিত পদ্ধতি তৈরি করেছি:

CREATE PROCEDURE [dbo].[uspGetNextID]
(
  @inID bigInt 
)
AS
BEGIN
    SET NOCOUNT ON;

    BEGIN TRANSACTION

    UPDATE MetaInfo WITH (ROWLOCK) 
      SET MetaValueLong = CASE 
                            WHEN ISNULL(MetaValueLong,0) > @inID THEN MetaValueLong+1 
                            ELSE @inID+1
                          END 
    WHERE MetaKey = 'Internal-ID-Last'

    SELECT MetaValueLong 
    FROM MetaInfo
    WHERE MetaKey = 'Internal-ID-Last'

    COMMIT TRANSACTION 

END

আমার প্রশ্নটি সহজভাবে, এই সঞ্চিত পদ্ধতিটি প্রত্যাশার মতো কাজ করে (সমস্ত কলকারীদের একটি অনন্য ফলাফল দেওয়া হবে)?


@all: অবগতির জন্য, তাই এই Q দ্বারা উত্পন্ন হওয়া: stackoverflow.com/q/6342732/27535
gbn

উত্তর:


8

আমি একবার দেখেছি এবং এমএস নিজেরাই লক ছাড়াই সমাধান সরবরাহ করে

http://blogs.msdn.com/b/sqlcat/archive/2006/04/10/sql-server-sequence-number.aspx

কোনও লক ইঙ্গিত সহ এটি একটি সহজ আপডেট, তবে তারা বলছে এটি লক / ডেডলক করে।

এটি সম্পর্কে এসও তেমন কিছুই নেই।

আমি আপনার রাউলোকে আপডলক যুক্ত করতে চাইছি ( "সারি হিসাবে সারণী" অনুসারে) তবে READPAST ছাড়াই)। ২ য় প্রক্রিয়া পড়া শুরু করার ক্ষেত্রে এটি বিচ্ছিন্নতা বাড়বে।

যাইহোক, আপনার সমস্ত প্রক্রিয়া একই সারিতে পড়তে / লিখতে চায় তা আমাকে দ্বিতীয় অনুমান করে। READPAST নিরাপদ সম্মিলিত অনুমতি দেয় তবে এই ক্ষেত্রে এটি অকেজো।

দ্রষ্টব্য: আপনি ২ য় নির্বাচনের পরিবর্তে OUTPUT ধারাটি ব্যবহার করতে পারেন তবে আপনার লেনদেনের প্রয়োজন হবে না।

আছে HTH ...


1
তুমি আমাকে এটা দ্বারা মেরেছ. নোট করুন যে এসকিউএল সার্ভার ২০১১-এ SEQUENCE কার্যকারিতা অন্তর্ভুক্ত তাই আপনার নিজের উদ্ভাবনের প্রয়োজনীয়তা শীঘ্রই চলে যেতে হবে (সময়ের আগে নয়)।
এনভোভেল

@ ডোর্টাস: সত্যই। এবং আরও ভাল চালায়: dba.stackexchange.com/q/1635/630
gbn

@dportas - এসকিউএনসিএন কি ইনপুট প্রয়োজনীয়তার জন্য অনুমতি দিতে পারে? বৈশিষ্ট্যটি সম্পর্কে আমার দ্রুত পঠনে আমি সেই কার্যকারিতাটি দেখিনি।
হোগান

1

নিম্নলিখিত জিনিস অনুপস্থিত

1. SET XACT_ABORT
2. Exception Handling (Try Catch)

হ্যাঁ, এটি আপনার শর্ত পূরণ করা উচিত। একবার যেমন পরিস্থিতি লেনদেনে আসে, এটি এর একাধিক উদাহরণ তৈরি করে এবং এরপরে, সমস্ত কলকারীদের একটি অনন্য ফলাফল অর্পণ করা হবে


যদি আমি নির্বাচনের আগে প্রতিশ্রুতি দেয় তবে কোনও সম্ভাবনা না থাকে আমি কোনও ভিন্ন কল দ্বারা সংরক্ষিত ফলাফলটি নির্বাচন করব?
হোগান

এটি সম্পর্কে নিশ্চিত না। তবে মনে হচ্ছে আপনি ঠিক আছেন। আমার পরীক্ষা করে দেখা দরকার. ধন্যবাদ। বিটিডাব্লু +1 এর জন্য, ভাল প্রশ্ন ...

0

সিরিয়ালাইজেশন প্রয়োজন হয় না এমন আরও একটি স্কেলযোগ্য সমাধান হ'ল:

CREATE PROCEDURE [dbo].[uspGetNextID]
(
  @inID BIGINT OUT
)
AS
      SET NOCOUNT ON
      SET IDENTITY_INSERT SequenceTable ON;
      INSERT INTO SequenceTable (id) VALUES (@inID);
      SET IDENTITY_INSERT SequenceTable OFF;
      INSERT INTO SequenceTable DEFAULT VALUES;
      DELETE FROM SequenceTable WITH (READPAST);
      SET @inID = SCOPE_IDENTITY();
RETURN;


@ ডিপোর্টাস - ধন্যবাদ আমি এই পদ্ধতির বিষয়ে অবগত ছিলাম তবে ইনপুট প্যারামিটারের কারণে এটি এখানে কাজ করে না।
হোগান

@ হোগান, আমি ইনপুট প্যারামিটারটি পরিচালনা করতে আমার পরামর্শটি পরিবর্তন করেছি। এটি বেশিরভাগই অনির্ধারিত।
nvogel

@ ডোর্টাস - ৫০০ এর আইআইডি সহ একটি কল করা হয়, 50 টি আইআইডি সহ কল ​​করা হয় - ক্রিয়া - ৫১, বি দিয়ে ৫২ সহ একটি রিটার্ন। প্রয়োজনীয়তা ব্যর্থ হয়।
হোগান

মজাদার. আমি বিভিন্ন ফলাফল পেয়েছি (২০০৮r2 এ)। আপনি কি ডিডিএল এর সাথে পুরো তিরস্কার পোস্ট করতে এবং আপনার বিল্ড / সংস্করণ বর্ণনা করতে পারেন?
nvogel
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.