سؤال

لدي جدول innodb يحتوي على مستخدمين ، مثل هذا:

+--------------+-----------------------+
| user_id      | name                  |
+--------------+-----------------------+
| 1            | Bob                   |
| 1            | Marry                 |
| 2            | Bob                   |
| 1            | John                  |
| 3            | Bob                   |
| 2            | Marry                 |
+--------------+-----------------------+

في كل إدراج I زيادة user_id بمقدار 1 ، على سبيل المثال ، سيكون المستخدم التالي لـ BOB هو 4

أستخدم هذا الاستعلام للقيام بذلك:

INSERT INTO users (user_id, name)
SELECT 1 + coalesce((SELECT max(user_id) FROM users WHERE name='Bob'), 0), 'Bob';

الآن أحتاج إلى التأكد من أن مستخدمين مختلفين لا يضيفان "بوب" في نفس الوقت. لا أريد أي bobs مع user_id 4. يجب أن يكون كل من معرفات مستخدم Bob مختلفة.

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

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

المحلول

على افتراض innodb هنا ، يمكنك استخدام حدد ... قفل وضع المشاركة لقفل الصفوف عند تحديدها.

نصائح أخرى

لحل الجزء الأول من سؤالك ، قم بإنشاء فهرس فريد على user_id واسم.

alter table `users` add unique index ak_user_id_name(user_id,name);

من شأنه أن يمنع تكرار user_id ، سجلات الأسماء.

الجواب على هذا السؤال هو نفسه هذا. ستقوم InnoDB بقفل صفوف أكثر مما تتوقع من أجل السلامة من خلال التسجيل الثنائي القائم على البيان.

الحل: استخدم التسجيل الثنائي القائم على الصف مع مستوى العزلة المخصصة للقراءة.

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