it-swarm.asia

هل يحصل INSERTs على التزام تلقائي؟

يقوم تطبيقنا بإطلاق استعلام INSERT إلى قاعدة بيانات MySQL لإضافة سجلات. أريد أن أعرف ما إذا كانت السجلات يتم تنفيذها تلقائيًا أم لا. إذا قمت بتشغيل الأمر ROLLBACK ، متى تقوم قاعدة البيانات بالتراجع؟ هل رولباك ممكن بعد الإلتزام؟

13
RPK

تعتمد الإجابة على سؤالك على ما إذا كنت ضمن المعاملة التي تمتد عبر أكثر من بيان أم لا. (لقد قمت بوضع علامة على السؤال بـ InnoDB ، وستكون الإجابة مختلفة مع MyISAM.)

من الدليل المرجعي: http://dev.mysql.com/doc/refman/5.1/en/commit.html

بشكل افتراضي ، يتم تشغيل MySQL مع تمكين وضع التشغيل التلقائي. هذا يعني أنه بمجرد تنفيذ بيان يقوم بتحديث (تعديل) جدول ، يخزن MySQL التحديث على القرص لجعله دائمًا.

لذا ، نعم ، افتراضيًا ، إذا كنت تستخدم INSERT فقط ، فسيتم الالتزام بالسجلات التي تقوم بإدراجها ، ولا فائدة من استرجاعها. (هذا هو نفسه تقريبًا التفاف كل عبارة بين BEGIN و COMMIT.)

ومع ذلك ، إذا كنت تتعامل مع المعاملات بشكل صريح ، فسيتعين عليك استخدام COMMIT لتخزين السجلات ، ولكن ستتمكن أيضًا من استخدام ROLLBACK.

يمكنك بدء معاملة صريحة باستخدام START TRANSACTION (أو BEGIN). هذا مستقل عن إعداد autocommit (افتراضيًا):

باستخدام START TRANSACTION ، يظل التعطيل التلقائي معطلًا حتى تقوم بإنهاء المعاملة باستخدام COMMIT أو ROLLBACK. ثم يعود الوضع التلقائي إلى حالته السابقة.

بدلا من ذلك ، إذا autocommit=0 ، أعتقد أن أي بيان يتبع نهاية أخرى للمعاملة ، سيبدأ معاملة (ولكن لا يزال بإمكانك استخدام START TRANSACTION صراحة) ؛ هذه على الأقل الطريقة التي أتبعها اشرح هذا :

وضع autocommit. إذا تم التعيين على 1 ، تصبح جميع التغييرات في الجدول نافذة المفعول على الفور. إذا تم تعيينه على 0 ، يجب عليك استخدام COMMIT لقبول معاملة أو ROLLBACK لإلغائها. إذا كان autocommit يساوي 0 وقمت بتغييره إلى 1 ، تقوم MySQL بتنفيذ التزام تلقائي لأي معاملة مفتوحة. طريقة أخرى لبدء المعاملة هي استخدام عبارة START TRANSACTION أو BEGIN. راجع القسم 12.3.1 ، "بدء المعاملة ، والتنفيذ ، وبناء الجملة ROLLBACK".

وبشكل أكثر تحديدًا ، يبدو أن "طريقة أخرى لبدء معاملة" تعني ضمنيًا أن إعداد "autocommit = 0" يكفي لبدء المعاملة (على الأقل قبل كل عبارة في بداية الجلسة أو يتبع COMMIT/ROLLBACK). أقترح استخدام BEGIN أو START TRANSACTION صراحة على أي حال حتى لو autocommit=0 ، لأنه يمكن أن يوضح متى تبدأ أو تنتهي المعاملة.

(قد تعتمد كيفية بدء المعاملة على الطريقة التي يستخدم بها تطبيقك MySQL.)

10
Bruno

افتراضيًا ، يتم تعيين InnoDB على autocommit = 1 أو ON . بمجرد الالتزام ، لا يمكن التراجع عنها.

يجب عليك القيام بأحد أمرين لتعطيله من الآن فصاعدًا:

الخيار 1: أضف هذا إلى /etc/my.cnf وأعد تشغيل mysql

[mysqld]
autocommit=0

الخيار 2: قم بتنفيذ أحد هذه الإجراءات في DB Conenction المفتوح قبل البدء في أي SQL ذات معنى

SET autocommit = 0;
START TRANSACTION;

تحت هذين الخيارين ، سيكون عليك تنفيذ COMMIT يدوي أو ROLLBACK .

مذكرة قانونية

إذا كان الجدول MyISAM ، فإن الشرح أبسط. نظرًا لعدم وجود معاملات لمحرك تخزين MyISAM ، فإن جميع INSERTs و UPDATEs و DELETE التي يتم تنفيذها دائمة. لا التراجع على الإطلاق.

7
RolandoMySQLDBA