كيف يمكنني تنفيذ الالتزام / التراجع عن الخلية في PHP؟
سؤال
وحسنا أساسا لدي هذا السيناريو الذي يستغرق وقتا طويلا لتنفيذ وأحيانا مرات من أصل ويترك البيانات شبه كاملة تطوف قاعدة البيانات الخاصة بي. (نعم أنا أعلم في عالم مثالي وأود أن تحديد ذلك بدلا من تنفيذ يرتكب ومستواها السابق ولكن أجد نفسي مجبرا على لا تفعل ذلك)
وهنا هي لغتي رمز الأساسية (تخلت عن البساطة):
$database = new PDO("mysql:host=host;dbname=mysql_db","username","password");
while (notDone())
{
$add_row = $database->prepare("INSERT INTO table (columns) VALUES (?)");
$add_row->execute(array('values'));
//PROCESSING STUFF THAT TAKES A LONG TIME GOES HERE
}
$database = null;
وهكذا مشكلتي هي أنه إذا أنه إذا كانت العملية برمتها داخل تلك الحلقة في حين ليست كاملة ثم أنا لا أريد الصف المدرج في البقاء هناك. أعتقد أن على نحو ما يمكن أن تستخدم يرتكب / مستواها السابق في بداية ونهاية الحلقة في حين أن تفعل ذلك ولكن لا أعرف كيف.
المحلول
ونلقي نظرة على هذا البرنامج التعليمي على المعاملات مع شركة تنمية نفط عمان.
وأساسا التفاف رمز تشغيل طويل في:
$dbh->beginTransaction();
...
$dbh->commit();
وقال "عندما ينتهي البرنامج النصي أو عند اتصال على وشك أن تكون مغلقة، وإذا كان لديك المعاملات المعلقة، وشركة تنمية نفط عمان لفة تلقائيا الى الوراء".
وهكذا ستفقد المعاملات التي تم بحقه عند توقيت السيناريو بها.
ولكن في الحقيقة، يجب عليك إعادة تصميم هذا بحيث لا تعتمد على scriipt البقاء على قيد الحياة.
نصائح أخرى
وتحتاج إلى استخدام الجداول على أساس ك InnoDB للمعاملات ثم استخدام أي مكتبة مثل شركة تنمية نفط عمان أو MySQLi التي تدعمها.
try
{
$mysqli->autocommit(FALSE);
$mysqli->query("insert into tblbook (id,cid,book) values('','3','book3.1')");
echo $q_ins=$mysqli->affected_rows."<br>";
$mysqli->query("update tblbook set book='book3' where cid='3'");
echo $q_upd=$mysqli->affected_rows."<br>";
$mysqli->commit();
}
catch(PDOException $e)
{
$mysqli->rollback();
echo $sql . '<br />' . $e->getMessage();
}
<?php
//This may help someone....This code commit the transactions
//only if both queries insert and update successfully runs
$mysqli=new mysqli("localhost","user_name","password","db_name");
if(mysqli_connect_errno())
{
echo "Connection failed: ".mysqli_connect_error();
}
else
{
$mysqli->autocommit(FALSE);
$mysqli->query("insert into tblbook (id,cid,book) values('','3','book3.1')");
echo $q_ins=$mysqli->affected_rows."<br>";
$mysqli->query("update tblbook set book='book3' where cid='3'");
echo $q_upd=$mysqli->affected_rows."<br>";
if($q_ins==1 && $q_upd==1)
{
$mysqli->commit();
echo "Commit<br>";
}
else
{
$mysqli->rollback();
echo "Rollback<br>";
}
}
?>