كيف يمكنني تنفيذ الالتزام / التراجع عن الخلية في PHP؟

StackOverflow https://stackoverflow.com/questions/329622

سؤال

وحسنا أساسا لدي هذا السيناريو الذي يستغرق وقتا طويلا لتنفيذ وأحيانا مرات من أصل ويترك البيانات شبه كاملة تطوف قاعدة البيانات الخاصة بي. (نعم أنا أعلم في عالم مثالي وأود أن تحديد ذلك بدلا من تنفيذ يرتكب ومستواها السابق ولكن أجد نفسي مجبرا على لا تفعل ذلك)

وهنا هي لغتي رمز الأساسية (تخلت عن البساطة):

$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();

و وفقا لهذا PDO صفحة وثيقة :

وقال "عندما ينتهي البرنامج النصي أو عند اتصال على وشك أن تكون مغلقة، وإذا كان لديك المعاملات المعلقة، وشركة تنمية نفط عمان لفة تلقائيا الى الوراء".

وهكذا ستفقد المعاملات التي تم بحقه عند توقيت السيناريو بها.

ولكن في الحقيقة، يجب عليك إعادة تصميم هذا بحيث لا تعتمد على 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>";
    }
}
?>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top