سلام
تابع commit() و autocommit() چیکار میکنن؟؟
کی مقدارشونو false , true میذاریم؟؟
-1 میدم بخاطر عنوان سوال
این دو تابع مربوط به transaction ها میشن. از Transcation ها برای اجرای کوئریهای مرتبط به هم استفاده میشه منظور اینکه اگر یکی از کوئری ها یا خطا مواجه شدن دیگه بقیه کوئری ها نباید اجرا بشن که اگر خطا داشت باید Roll back و اگه خطایی نداشت میشه Commit کرد.
commit مقدار TRUE با FALSE نمیگیره و برای اعمال نهایی کوئری هست.
وقتی Autocommit فعال باشه (که بطور پیشفرض فعاله) هر کوئری به ترتیب اجرا میشه اما اگر غیر فعال باشه تا زمانی که دستور commit ارسال نشه کوئری ها اعمال نمیشن.
مثال:
<?php
$mysqli = new mysqli("localhost", "root", "", "test");
/* check connection */
if (mysqli_connect_errno()) {
printf("Connect failed: %s\n", mysqli_connect_error());
exit();
}
$mysqli->query("
CREATE TABLE person(
ID INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(25),
lname VARCHAR(50),
gender VARCHAR(1)
) ENGINE=InnoDB;
");
/* set autocommit to off */
$mysqli->autocommit(FALSE);
/* Insert some values */
$mysqli->query("INSERT INTO person VALUES (null,'peter', ';-peter', 'M')");
$mysqli->query("INSERT INTO person VALUES (null,'sara', 'l-sara', 'F')");
/* commit transaction */
$mysqli->commit();
/* close connection */
$mysqli->close();
?>
در کد بالا اگر $mysqli->commit(); رو غیرفعال کنی دیگه دو کوئری INSERT اعمال نمیشن.
مزیت استفاده از transaction ها چیه؟/
اگه واسه کوئری ها استفاده نشه به مشکل میخوریم؟
گفتم که برادر/خواهر عزیز من :)
مزیتش اینه که میتونی از اجرای کوئری هایی که به هم ربط دارن مطمئن بشی. فکر کن کوئری ۱و۲و۳ داری و کوئری ۲و۳ زمانی باید اجرا بشن که قبلش تو کوئری ۱ هیچ مشکلی نباشه.
اگر در مورد مشابه بالا استفاده نکنی ممکنه مشکل پیش بیاد.
بطور کلی این میشه:
try {
// First of all, let's begin a transaction
$db->beginTransaction();
// A set of queries; if one fails, an exception should be thrown
$db->query('first query');
$db->query('second query');
$db->query('third query');
// If we arrive here, it means that no exception was thrown
// i.e. no query has failed, and we can commit the transaction
$db->commit();
} catch (Exception $e) {
// An exception has been thrown
// We must rollback the transaction
$db->rollback();
}
[color=#ff6633]نکته[/color]: ()beginTransaction با ( autocommit(FALSE تفاوتی نداره هر دو یک Transcation رو شروع میکنن. فقط ()beginTransaction تو نسخه های جدید تر php اومده.
سوال برنامه نویسی دارید؟
ندونستن عیب نیست، نپرسیدن چرا!