English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
يستخدم MySQL المعاملات بشكل رئيسي لمعالجة البيانات الكبيرة والمعقدة. على سبيل المثال، في نظام إدارة الموظفين، عند حذف موظف، يجب حذف بيانات الموظف الأساسية، بالإضافة إلى حذف المعلومات المتعلقة به، مثل البريد الإلكتروني، المقالات، وما إلى ذلك، وبالتالي تشكل هذه جملة إجراءات قاعدة البيانات معاملة!
يدعم MySQL المعاملات فقط في قواعد البيانات أو الجداول التي تستخدم محرك قاعدة البيانات InnoDB.
يمكن استخدام معالجة المعاملات للحفاظ على سلامة قاعدة البيانات، وتأمين تنفيذ جمل SQL الجماعية إما كاملة أو لا تنفذ أبدًا.
تستخدم المعاملات لإدارة جمل insert،update،delete
بشكل عام، يجب أن تفي المعاملات ب4 شروط (ACID): الجزئية (Atomicity، أو ما يُعرف بالغير قابل للإنقسام)، التناسق (Consistency)، العزل (Isolation، وتُعرف أيضًا بالاستقلالية)، الاستمرارية (Durability).
الجزئية:يجب أن تنتهي جميع العمليات في المعاملة واحدة تلو الأخرى، أو لا تنتهي أبدًا في أي مرحلة من المراحل. إذا حدث خطأ أثناء تنفيذ المعاملة، يتم رفضها إلى حالة المعاملة عند بدءها، كما لو لم يتم تنفيذ المعاملة أبدًا.
التناسق:لا يتم كسر سلامة قاعدة البيانات قبل بدء المعاملة وبعد انتهائها. مما يعني أن يجب أن تكون المعلومات المكتوبة متوافقة تمامًا مع جميع القواعد المسبقة، بما في ذلك دقة المعلومات وتسلسلها وكذلك القدرة على إكمال العمل المحدد تلقائيًا.
العزل:يسمح قاعدة البيانات بتنفيذ عدة معاملات متوازية على بياناتها للقراءة والكتابة والتعديل، حيث يمكن للعزل منع عدم التوافق في حالة تنفيذ المعاملات المتوازية. يتم تقسيم عزل المعاملات إلى مستويات مختلفة، بما في ذلك غير الملتزم بالقراءة (Read uncommitted)、الملتزم بالقراءة (read committed)、القراءة المتكررة (repeatable read) والسلسلة (Serializable).
الاستمرارية:بعد انتهاء معالجة المعاملات، تكون التعديلات على البيانات دائمة، حتى لو حدث عطل في النظام.
في إعدادات الخطأ الافتراضية لـ MySQL، يتم التحقق من المعاملات تلقائيًا، أي بعد تنفيذ جملة SQL يتم تنفيذ عملية COMMIT فورًا. لذا، يجب استخدام الأمر BEGIN أو START TRANSACTION، أو تنفيذ الأمر SET AUTOCOMMIT=0، لمنع استخدام التحقق التلقائي للجلسة الحالية.
تعليمات التحكم في المعاملات:}
يبدأ أو يفتح معاملات التبويب بوضوح؛
يمكن استخدام COMMIT أيضًا كـ COMMIT WORK، ولكن كلاهما متساويان. سيقوم COMMIT بتقديم المعاملات ويجعل جميع التغييرات التي تم إجراؤها على قاعدة البيانات دائمة؛
يمكن استخدام ROLLBACK أيضًا كـ ROLLBACK WORK، ولكن كلاهما متساويان. سينتهي التراجع مع المعاملات ويقوم بإلغاء جميع التغييرات غير المكتملة التي يتم إجراؤها حاليًا؛
تخلص من نقطة الحفظ المعرفية، تتيح نقطة الحفظ إنشاء نقطة حفظ في المعاملة، يمكن أن تكون هناك نقاط حفظ متعددة في معاملة واحدة؛
تراجع المعاملات إلى وسم معرف؛
يستخدم SET TRANSACTION لضبط مستوى عزل المعاملات. يقدم محرك التخزين InnoDB مستويات عزل المعاملات التالية: READ UNCOMMITTED،READ COMMITTED،REPEATABLE READ و SERIALIZABLE.
1、إجراء المعاملات باستخدام BEGIN, ROLLBACK, COMMIT:
BEGIN بدء معاملات
ROLLBACK تراجع المعاملات
COMMIT تأكيد المعاملات
2、تغيير نمط التسليم التلقائي لـ MySQL باستخدام SET:
SET AUTOCOMMIT=0 منع التسليم التلقائي
SET AUTOCOMMIT=1 تشغيل التسليم التلقائي
mysql> use w3codebox; تم تغيير قاعدة البيانات mysql> CREATE TABLE w3codebox_transaction_test(id int(5)) engine=innodb; # إنشاء جدول بيانات استعلام صحيح، لم تؤثر على أي سجلات (0.04 ثانية) mysql> select * from w3codebox_transaction_test; المجموعة الفارغة (0.01 ثانية) mysql> begin; # 开始事务 Query OK, 0 rows affected (0.00 sec) mysql> insert into w3codebox_transaction_test value(5); Query OK, 1 rows affected (0.01 sec) mysql> insert into w3codebox_transaction_test value(6); Query OK, 1 rows affected (0.00 sec) mysql> commit; # 提交事务 Query OK, 0 rows affected (0.01 sec) mysql> select * from w3codebox_transaction_test; +------+ | id | +------+ | 5 | | 6 | +------+ 2 rows in set (0.01 sec) mysql> begin; # 开始事务 Query OK, 0 rows affected (0.00 sec) mysql> insert into w3codebox_transaction_test values(7); Query OK, 1 rows affected (0.00 sec) mysql> rollback; # 回滚 Query OK, 0 rows affected (0.00 sec) mysql> select * from w3codebox_transaction_test; # 因为回滚所以数据没有插入 +------+ | id | +------+ | 5 | | 6 | +------+ 2 rows in set (0.01 sec) mysql>
<?php $dbhost = 'localhost'; // mysql服务器主机地址 $dbuser = 'root'; // mysql用户名 $dbpass = '123456'; // mysql用户名密码 $conn = mysqli_connect($dbhost, $dbuser, $dbpass); if(! $conn ) { die('连接失败: ' . mysqli_error($conn)); } // 设定编码,防止中文乱码 mysqli_query($conn, "set names utf8"); mysqli_select_db($conn, 'w3codebox'); mysqli_query($conn, "SET AUTOCOMMIT=0"); // تعيين عدم التحقق التلقائي، لأن MYSQL يقوم بالتنفيذ فوراً mysqli_begin_transaction($conn); // بدء تعريف المعاملات if(!mysqli_query($conn, "insert into w3codebox_transaction_test (id) values(8)")) { mysqli_query($conn, "ROLLBACK"); // التحقق من الفشل وإعادة التشغيل } if(!mysqli_query($conn, "insert into w3codebox_transaction_test (id) values(9)")) { mysqli_query($conn, "ROLLBACK"); // التحقق من الفشل وإعادة التشغيل } mysqli_commit($conn); // تنفيذ المعاملات mysqli_close($conn); ?>