محاكاة تسلسل المعاملات الآمنة في الخلية

StackOverflow https://stackoverflow.com/questions/805808

  •  03-07-2019
  •  | 
  •  

سؤال

ونحن نستخدم الخلية مع محرك التخزين ك InnoDB والمعاملات كثيرا، ولقد واجهت مشكلة: نحن بحاجة إلى وسيلة لطيفة لمحاكاة تسلسل أوراكل في الخلية. المتطلبات هي:  - دعم التزامن  - سلامة المعاملات  - أداء ماكس (يعني التقليل من الأقفال والجمود)

ونحن لا نهتم إذا كان بعض من القيم لن تستخدم، أي ثغرات في تسلسل لا بأس بها. هناك طريقة سهلة لarchieve أن طريق إنشاء InnoDB الجدول منفصل مع عداد، ولكن هذا يعني أنه سيشارك في المعاملات وسوف أعرض الأقفال والانتظار. وأنا أفكر في محاولة طاولة MYISAM مع الأقفال اليدوية، أية أفكار أخرى أو أفضل الممارسات؟

هل كانت مفيدة؟

المحلول

إذا لصناعة السيارات في الزيادة ليست جيدة بما فيه الكفاية لتلبية الاحتياجات الخاصة بك، يمكنك إنشاء آلية تسلسل الذرية مع ن اسمه تسلسل مثل هذا:

وإنشاء جدول لتخزين متواليات الخاص بك:

CREATE TABLE sequence (
  seq_name varchar(20) unique not null,
  seq_current unsigned int not null
);

وعلى افتراض أن يكون لديك صف "فو" في الجدول يمكنك بالذرة الحصول على تسلسل المقبل معرف مثل هذا:

UPDATE sequence SET seq_current = (@next := seq_current + 1) WHERE seq_name = 'foo';
SELECT @next;

ولا أقفال المطلوبة. تحتاج كل من البيانات ليتم تنفيذها في نفس الدورة، بحيث يتم تعريف متغيرnext المحلية في الواقع عندما يحدث التحديد.

نصائح أخرى

ويعطى الطريقة الصحيحة للقيام بذلك في دليل الخلية :

UPDATE child_codes SET counter_field = LAST_INSERT_ID(counter_field + 1);
SELECT LAST_INSERT_ID();

ونحن شركة الألعاب المعاملات المرتفعة وتحتاج هذا النوع من الحلول لتلبية احتياجاتنا. كان واحدا من ملامح تسلسل أوراكل أيضا قيمة الزيادة التي يمكن أن توضع أيضا.

والحل يستخدم DUPLICATE KEY.

CREATE TABLE sequences (
  id BIGINT DEFAULT 1,
  name CHAR(20),
  increment TINYINT,
  UNIQUE KEY(name)
);

لتحصل على مؤشر المقبل:

وخلاصة ما يلي مع إجراء مخزن أو sp_seq_next_val(VARCHAR) وظيفة:

INSERT INTO sequences (name) VALUES ("user_id") ON DUPLICATE KEY UPDATE id = id + increment;<br/>
SELECT id FROM sequences WHERE name = "user_id";

وليس هل العمود الخلية الهوية على الطاولة التعامل مع هذا؟

وCREATE TABLE TABLE_NAME (    معرف INTEGER AUTO_INCREMENT المفتاح الأساسي )

وأم أنك تبحث لاستخدامها لشيء آخر غير مجرد إدخالها في جدول آخر؟

إذا كنت تكتب باستخدام لغة إجرائية وكذلك (بدلا من SQL فقط) ثم الخيار الآخر سيكون لإنشاء جدول يحتوي على عدد صحيح واحد (أو عدد صحيح طويل) قيمة وإجراء مخزن التي تأمينه، يتم اختيارهم من ذلك، يتزايد عليه ومقفلة من قبل إرجاع القيمة.

و(ملاحظة - زيادة دائما قبل أن يعود لقيمة - هو تحقيق أقصى قدر من فرصة من عدم حصولهم على التكرارات إذا كان هناك أخطاء - أو التفاف كل شيء في معاملة)

ويمكنك عندئذ نسمي هذا بشكل مستقل من الرئيسي الخاص بك إدراج / تحديث (حتى لا ننشغل في أي معاملات التي تم إنشاؤها تلقائيا من خلال آلية الدعوة) ومن ثم تمريرها كمعلمة إلى أي مكان تريد استخدامها.

ولأنه مستقل عن بقية الاشياء كنت أفعل ذلك يجب أن تكون سريعة وتجنب المشاكل تأمين. حتى لو كنت فعلت نرى الخطأ الناجم عن تأمين (من غير المحتمل إلا إذا كنت إثقال قاعدة البيانات) هل يمكن أن نسميها الثاني مرة الثالثة /.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top