এসকিউএল সার্ভারে একাধিক কর্মীদের জন্য ফিফোর সারি সারণী


15

আমি নিম্নলিখিত স্ট্যাকওভারফ্লো প্রশ্নের উত্তর দেওয়ার চেষ্টা করছিলাম:

কিছুটা নির্বোধ উত্তর পোস্ট করার পরে, আমি বুঝতে পেরেছিলাম যে আমার মুখটি আমার অর্থ কোথায় ছিল এবং আমি যে দৃশ্যের প্রস্তাব দিচ্ছিলাম তা পরীক্ষা করে নিচ্ছি, নিশ্চিত হয়ে উঠুন যে আমি কোনও বুনো হাঁসের তাড়া করে ওপি পাঠাচ্ছি না। ঠিক আছে, এটি আমার ধারণা থেকে অনেক বেশি শক্ত হয়ে গেছে (কারও কাছে অবাক হওয়ার কিছু নেই, আমি নিশ্চিত)।

আমি এখানে যা চেষ্টা করেছি এবং ভেবেছিলাম তা এখানে:

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

  • আমি তখন একটি পরিবর্তনশীল মধ্যে পছন্দসই পরবর্তী QueueID নির্বাচন চেষ্টা করেছি, বিভিন্ন সমন্বয় ব্যবহার READPAST, UPDLOCK, HOLDLOCK, এবং ROWLOCKএকচেটিয়াভাবে আপডেটের জন্য সারি যে অধিবেশন দ্বারা সংরক্ষণ করা। আমি যে সমস্ত প্রকরণের চেষ্টা করেছি তার সবগুলিই আগের মতো একই সমস্যাগুলির সাথে ভুগছিল READPAST, অভিযোগের সাথে নির্দিষ্ট সংমিশ্রণের জন্য :

    আপনি কেবল READ COMPITTED বা পুনরাবৃত্তিযোগ্য READ বিচ্ছিন্নতার স্তরে READPAST লকটি নির্দিষ্ট করতে পারেন।

    এর কারণ হল এটা বিভ্রান্তিকর ছিল ছিল পড়ুন অঙ্গীকারবদ্ধ। আমি এর আগেও এটি চালিয়েছি এবং হতাশাজনক is

  • যেহেতু আমি এই প্রশ্নটি লেখা শুরু করেছি, তাই রেমাস রুসানী প্রশ্নের উত্তরটি একটি নতুন উত্তর পোস্ট করেছেন। আমি তার লিঙ্কিত নিবন্ধটি পড়েছি এবং দেখতে পাচ্ছি যে তিনি ধ্বংসাত্মক পাঠগুলি ব্যবহার করছেন, যেহেতু তিনি তার উত্তরে বলেছিলেন যে "ওয়েব কলগুলির সময়কালের জন্য লক ধরে রাখা বাস্তবতাই সম্ভব নয়।" তার নিবন্ধটি হট স্পট এবং পৃষ্ঠাগুলি সম্পর্কে কোনও আপডেট করতে বা মুছে ফেলার জন্য লকিংয়ের প্রয়োজনীয়তার বিষয়ে যা বলেছে তা পড়ার পরে আমি আশঙ্কা করি যে আমি যা খুঁজছি তা করার জন্য আমি যদি সঠিক লকগুলি নিয়ে কাজ করতে সক্ষম হয়েছি তবে এটি স্কেলযোগ্য হবে না এবং পারে বিশাল সম্মতি হ্যান্ডেল না।

এই মুহুর্তে আমি কোথায় যাব তা নিশ্চিত নই। এটি কি সত্য যে সারিটি প্রক্রিয়াজাতকরণের সময় লকগুলি বজায় রাখা অর্জন করা যায় না (এমনকি এটি উচ্চ টিপিএস বা বৃহত্তর সম্মতি সমর্থন না করেও)? আমি কী মিস করছি?

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

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

অধিবেশন ঘ

/* Session 1: Setup and control - Run this session first, then immediately run all other sessions */
IF Object_ID('dbo.Queue', 'U') IS NULL
   CREATE TABLE dbo.Queue (
      QueueID int identity(1,1) NOT NULL,
      StatusID int NOT NULL,
      QueuedDate datetime CONSTRAINT DF_Queue_QueuedDate DEFAULT (GetDate()),
      CONSTRAINT PK_Queue PRIMARY KEY CLUSTERED (QueuedDate, QueueID)
   );

IF Object_ID('dbo.QueueHistory', 'U') IS NULL
   CREATE TABLE dbo.QueueHistory (
      HistoryDate datetime NOT NULL,
      QueueID int NOT NULL
   );

IF Object_ID('dbo.LockHistory', 'U') IS NULL
   CREATE TABLE dbo.LockHistory (
      HistoryDate datetime NOT NULL,
      ResourceType varchar(100),
      RequestMode varchar(100),
      RequestStatus varchar(100),
      ResourceDescription varchar(200),
      ResourceAssociatedEntityID varchar(200)
   );

IF Object_ID('dbo.StartTime', 'U') IS NULL
   CREATE TABLE dbo.StartTime (
      StartTime datetime NOT NULL
   );

SET NOCOUNT ON;

IF (SELECT Count(*) FROM dbo.Queue) < 10000 BEGIN
   TRUNCATE TABLE dbo.Queue;

   WITH A (N) AS (SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1),
   B (N) AS (SELECT 1 FROM A Z, A I, A P),
   C (N) AS (SELECT Row_Number() OVER (ORDER BY (SELECT 1)) FROM B O, B W)
   INSERT dbo.Queue (StatusID, QueuedDate)
   SELECT 1, DateAdd(millisecond, C.N * 3, GetDate() - '00:05:00')
   FROM C
   WHERE C.N <= 10000;
END;

TRUNCATE TABLE dbo.StartTime;
INSERT dbo.StartTime SELECT GetDate() + '00:00:15'; -- or however long it takes you to go run the other sessions
GO
TRUNCATE TABLE dbo.QueueHistory;
SET NOCOUNT ON;

DECLARE
   @Time varchar(8),
   @Now datetime;
SELECT @Time = Convert(varchar(8), StartTime, 114)
FROM dbo.StartTime;
WAITFOR TIME @Time;

DECLARE @i int,
@QueueID int;
SET @i = 1;
WHILE @i <= 33 BEGIN
   SET @Now  = GetDate();
   INSERT dbo.QueueHistory
   SELECT
      @Now,
      QueueID
   FROM
      dbo.Queue Q WITH (NOLOCK)
   WHERE
      Q.StatusID <> 1;

   INSERT dbo.LockHistory
   SELECT
      @Now,
      L.resource_type,
      L.request_mode,
      L.request_status,
      L.resource_description,
      L.resource_associated_entity_id
   FROM
      sys.dm_tran_current_transaction T
      INNER JOIN sys.dm_tran_locks L
         ON L.request_owner_id = T.transaction_id;
   WAITFOR DELAY '00:00:01';
   SET @i = @i + 1;
END;

WITH Cols AS (
   SELECT *, Row_Number() OVER (PARTITION BY HistoryDate ORDER BY QueueID) Col
   FROM dbo.QueueHistory
), P AS (
   SELECT *
   FROM
      Cols
      PIVOT (Max(QueueID) FOR Col IN ([1], [2], [3], [4], [5], [6], [7], [8])) P
)
SELECT L.*, P.[1], P.[2], P.[3], P.[4], P.[5], P.[6], P.[7], P.[8]
FROM
   dbo.LockHistory L
   FULL JOIN P
      ON L.HistoryDate = P.HistoryDate

/* Clean up afterward
DROP TABLE dbo.StartTime;
DROP TABLE dbo.LockHistory;
DROP TABLE dbo.QueueHistory;
DROP TABLE dbo.Queue;
*/

অধিবেশন 2

/* Session 2: Simulate an application instance holding a row locked for a long period, and eventually abandoning it. */
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET NOCOUNT ON;
SET XACT_ABORT ON;

DECLARE
   @QueueID int,
   @Time varchar(8);
SELECT @Time = Convert(varchar(8), StartTime + '0:00:01', 114)
FROM dbo.StartTime;
WAITFOR TIME @Time;
BEGIN TRAN;

--SET @QueueID = (
--   SELECT TOP 1 QueueID
--   FROM dbo.Queue WITH (READPAST, UPDLOCK)
--   WHERE StatusID = 1 -- ready
--   ORDER BY QueuedDate, QueueID
--);

--UPDATE dbo.Queue
--SET StatusID = 2 -- in process
----OUTPUT Inserted.*
--WHERE QueueID = @QueueID;

SET @QueueID = NULL;
UPDATE Q
SET Q.StatusID = 1, @QueueID = Q.QueueID
FROM (
   SELECT TOP 1 *
   FROM dbo.Queue WITH (ROWLOCK, READPAST)
   WHERE StatusID = 1
   ORDER BY QueuedDate, QueueID
) Q

PRINT @QueueID;

WAITFOR DELAY '00:00:20'; -- Release it partway through the test

ROLLBACK TRAN; -- Simulate client disconnecting

সেশন 3

/* Session 3: Run a near-continuous series of "failed" queue processing. */
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET XACT_ABORT ON;
SET NOCOUNT ON;
DECLARE
   @QueueID int,
   @EndDate datetime,
   @NextDate datetime,
   @Time varchar(8);

SELECT
   @EndDate = StartTime + '0:00:33',
   @Time = Convert(varchar(8), StartTime, 114)
FROM dbo.StartTime;

WAITFOR TIME @Time;

WHILE GetDate() < @EndDate BEGIN
   BEGIN TRAN;

   --SET @QueueID = (
   --   SELECT TOP 1 QueueID
   --   FROM dbo.Queue WITH (READPAST, UPDLOCK)
   --   WHERE StatusID = 1 -- ready
   --   ORDER BY QueuedDate, QueueID
   --);

   --UPDATE dbo.Queue
   --SET StatusID = 2 -- in process
   ----OUTPUT Inserted.*
   --WHERE QueueID = @QueueID;

   SET @QueueID = NULL;
   UPDATE Q
   SET Q.StatusID = 1, @QueueID = Q.QueueID
   FROM (
      SELECT TOP 1 *
      FROM dbo.Queue WITH (ROWLOCK, READPAST)
      WHERE StatusID = 1
      ORDER BY QueuedDate, QueueID
   ) Q

   PRINT @QueueID;

   SET @NextDate = GetDate() + '00:00:00.015';
   WHILE GetDate() < @NextDate SET NOCOUNT ON;
   ROLLBACK TRAN;
END

সেশন 4 এবং তার বেশি - আপনার পছন্দ মতো

/* Session 4: "Process" the queue normally, one every second for 30 seconds. */
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET XACT_ABORT ON;
SET NOCOUNT ON;

DECLARE @Time varchar(8);
SELECT @Time = Convert(varchar(8), StartTime, 114)
FROM dbo.StartTime;
WAITFOR TIME @Time;

DECLARE @i int,
@QueueID int;
SET @i = 1;
WHILE @i <= 30 BEGIN
   BEGIN TRAN;

   --SET @QueueID = (
   --   SELECT TOP 1 QueueID
   --   FROM dbo.Queue WITH (READPAST, UPDLOCK)
   --   WHERE StatusID = 1 -- ready
   --   ORDER BY QueuedDate, QueueID
   --);

   --UPDATE dbo.Queue
   --SET StatusID = 2 -- in process
   --WHERE QueueID = @QueueID;

   SET @QueueID = NULL;
   UPDATE Q
   SET Q.StatusID = 1, @QueueID = Q.QueueID
   FROM (
      SELECT TOP 1 *
      FROM dbo.Queue WITH (ROWLOCK, READPAST)
      WHERE StatusID = 1
      ORDER BY QueuedDate, QueueID
   ) Q

   PRINT @QueueID;
   WAITFOR DELAY '00:00:01'
   SET @i = @i + 1;
   DELETE dbo.Queue
   WHERE QueueID = @QueueID;   
   COMMIT TRAN;
END

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

একটি আকর্ষণীয় READPAST, UPDLOCK, ROWLOCKরিঙ্কেল হ'ল ক্যুই হিস্টরি টেবিলটিতে ডেটা ক্যাপচারের জন্য আমার স্ক্রিপ্টটি কিছুই করছে না। আমি অবাক হয়েছি কারণ এটি যদি স্ট্যাটাসআইডি প্রতিশ্রুতিবদ্ধ না হয়? এটি WITH (NOLOCK)তাত্ত্বিকভাবে কাজ করা উচিত তাই এটি ব্যবহার করছে ... এবং এটি আগে কাজ করে! এখন কেন এটি কাজ করছে না তা আমি নিশ্চিত নই তবে এটি সম্ভবত অন্য একটি শেখার অভিজ্ঞতা।
এরিক

আপনি কী কোডটি ক্ষুদ্রতম নমুনায় হ্রাস করতে পারবেন যা ডেডলকিং এবং আপনি সমাধান করার চেষ্টা করছেন এমন অন্যান্য সমস্যা প্রদর্শন করে?
নিক চামাস

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

ধ্বংসাত্মক পড়ার পদ্ধতির চেষ্টা করুন এবং প্রযোজ্য আইটেমগুলিকে একটি পৃথক টেবিলের মধ্যে রাখুন যেখানে থেকে প্রয়োজনে সেগুলি পুনরায় সজ্জিত করা যেতে পারে। যদি এটি ঠিক করে দেয় তবে আপনি পুনরায় এঙ্কিউ প্রক্রিয়াটি সুচারুভাবে কাজ করতে বিনিয়োগ করতে পারেন।
নিক চ্যামাস

উত্তর:


10

আপনার ঠিক 3 টি লক ইঙ্গিত দরকার

  • READPAST
  • UPDLOCK
  • দাঁড়কে ঠিকভাবে ধরে রাখবার জন্যে নৌকার দুপাশে লাগানো যান্ত্রিক ব্যবস্থা

এর উত্তরে আমি এর আগে এসও তে উত্তর দিয়েছি: /programming/939831/sql-server-process-queue-race-condition/940001#940001

রেমাস যেমন বলেছে, পরিষেবা ব্রোকারটি ব্যবহার করা ভাল তবে এই ইঙ্গিতগুলি কার্যকর করে

বিচ্ছিন্নতা স্তর সম্পর্কে আপনার ত্রুটিটির অর্থ সাধারণত প্রতিলিপি করা বা NOLOCK জড়িত।


উপরে উল্লিখিত হিসাবে আমার স্ক্রিপ্টে h ইঙ্গিতগুলি ব্যবহার করে ফলস্বরূপ অচল এবং প্রসারণের ব্যবস্থা নেই। ( UPDATE SET ... FROM (SELECT TOP 1 ... FROM ... ORDER BY ...)) এর অর্থ কি লকটি ধারণ করে আমার আপডেটের প্যাটার্নটি কাজ করতে পারে না? এছাড়াও, আপনার READPASTসাথে একত্রিত হওয়ার মুহুর্তটি HOLDLOCKত্রুটিটি পান। এই সার্ভারটিতে কোনও প্রতিলিপি নেই এবং বিচ্ছিন্নতা স্তরটি পুনর্নির্দেশ করা।
এরিক

2
@ এরিক - আপনি টেবিলটিকে কীভাবে জিজ্ঞাসা করছেন ঠিক তত গুরুত্বপূর্ণ, কীভাবে সারণিটি কাঠামোবদ্ধ। টেবিল আপনি একটি সারিতে যেমন ব্যবহার করছেন করা আবশ্যক শুরু dequeue অর্ডার যেমন যে পরবর্তী আইটেম dequeued করা দ্ব্যর্থহীন হয় ক্লাস্টার । এটি গুরুত্বপূর্ণ। উপরে আপনার কোডটি স্কিম করে, আমি কোনও ক্লাস্টারযুক্ত সূচী সংজ্ঞায়িত দেখতে পাচ্ছি না।
নিক চামাস

@ নিক যা পুরোপুরি বিশিষ্ট জ্ঞান তৈরি করে এবং আমি কেন জানি না তা জানি না। আমি যথাযথ পিকে সীমাবদ্ধতা জুড়েছি (এবং উপরে আমার স্ক্রিপ্টটি আপডেট করেছি), এবং এখনও ডেডলক পেয়েছি। যাইহোক, আইটেমগুলি এখন ডান তালাবদ্ধ আইটেমগুলির পুনরাবৃত্তি প্রক্রিয়াকরণ বাদ দিয়ে সঠিক ক্রমে প্রক্রিয়া করা হয়েছিল।
এরিক

@ এরিক - ১. আপনার কাতারে কেবল সারিবদ্ধ আইটেম থাকতে হবে। অনুসন্ধান এবং আইটেমটির অর্থ এটি সারি সারণী থেকে মুছে ফেলা উচিত। আমি দেখতে পাচ্ছি যে আপনি পরিবর্তে StatusIDকোনও আইটেম অনুসন্ধান করার জন্য আপডেট করছেন । এটা কি ঠিক? ২. আপনার প্রাপ্য অর্ডারটি দ্ব্যর্থহীন হতে হবে। আপনি যদি আইটেমগুলি সন্ধান করে থাকেন GETDATE()তবে উচ্চ পরিমাণে এটি সম্ভবত খুব বেশি সংখ্যক আইটেম একই সাথে শনাক্ত করার জন্য সমানভাবে যোগ্য হয়ে উঠবে। এটি অচলাবস্থার দিকে পরিচালিত করবে। আমি IDENTITYএকটি দ্ব্যর্থহীন শনাক্ত আদেশের গ্যারান্টি দিতে ক্লাস্টার ইনডেক্সে একটি যুক্ত করার পরামর্শ দিই ।
নিক চামাস

1

এসকিউএল সার্ভার রিলেশনাল ডেটা সংরক্ষণের জন্য দুর্দান্ত কাজ করে। চাকরীর সারি হিসাবে, এটি এত দুর্দান্ত নয়। এই নিবন্ধটি মাইএসকিউএল জন্য লেখা হয়েছে দেখুন কিন্তু এটি এখানে প্রয়োগ করতে পারেন। https://blog.engineyard.com/2011/5-subtle-ways-youre-using-mysql-as-a-queue-and-why-itll-bite-you


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

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

নিবন্ধটি ঠিক সেটির পরামর্শ দেয় না: সারিতে সারণীতে কাজের জন্য কেবলমাত্র আইটেম প্রস্তুত রয়েছে।?
এরিক

2
@ এরিক: আপনি এই অনুচ্ছেদটি উল্লেখ করছেন, তাই না? ওয়ান-বিগ-টেবিল সিন্ড্রোম এড়ানো সত্যিই সহজ। কেবলমাত্র নতুন ইমেলগুলির জন্য একটি পৃথক টেবিল তৈরি করুন এবং আপনি যখন এগুলি প্রক্রিয়াজাতকরণ শেষ করেন, সেগুলি দীর্ঘমেয়াদী স্টোরেজে অন্তর্ভুক্ত করুন এবং তারপরে তাদের সারি সারণি থেকে মুছে ফেলুন। নতুন ইমেলগুলির টেবিলটি সাধারণত খুব ছোট থাকবে এবং এটির ক্রিয়াকলাপ দ্রুত হবেএটির সাথে আমার ঝগড়াটি এটি 'বড় সারি' ইস্যুটির কার্যক্রম হিসাবে দেওয়া হয়েছে । এই প্রস্তাবটি নিবন্ধ খোলার উচিত ছিল, এটি একটি মৌলিক বিষয় issue
রেমাস রুসানু

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