1

現在、ある時点で 100 個の相互依存クエリを起動する必要があるシステムを開発しています。

私のスクリプト(現在実行中)では、

$query1 = mysql_query("INSERT_QUERY_STRING");
if(!$query) {
    die('error'.mysql_error());
}

//this loop can be turn more than 100 times

while(CONDITION) {
    //query generated here
    $query2 = mysql_query("UPDATE_QUERY_STRING");
    $query3 = mysql_query("UPDATE_QUERY_STRING");
    $query4 = mysql_query("UPDATE_QUERY_STRING");
    $query5 = mysql_query("UPDATE_QUERY_STRING");

    if(!$query2 || !$query3 || !$query4 || !$query5) {
        die('error '.mysql_error());
    }
}

$query6 = mysql_query("UPDATE_QUERY_STRING");
if(!$query6) {
    die('error '.mysql_error());
}

構文エラーを無視します。これは単なるロジックです

問題は、すべてのクエリが相互に依存しているため、いずれかが失敗した場合、以前に発生したすべての変更を取り消す必要があることです。MYSQL TRANSACTION、COMMIT、ROLLBACK を使用する 1 つのソリューションを知っています。これが私が考え出したことです(これを行う予定です)、

$processes = array();

$processes[] = "INSERT_QUERY_STRING"; //query1

//this loop can be turn more than 100 times

while(CONDITION) {
    //query generated here
    $processes[] = "UPDATE_QUERY_STRING"; //looping queries
}

$processes[] = "UPDATE_QUERY_STRING" //last query

mysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");    
$error = false;
for($i=0;$i < count($processes) ; $i++)
{
    $q = mysql_query($processes[$i]);
    if(!$q) {
        $error = true;
        break;
    }
}

if($error == false) {
    mysql_query("COMMIT");
}
else {
    mysql_query("ROLLBACK");
}

私のソリューションは良い/最高ですか? 同じことをより迅速かつ効果的に行う他の解決策はありますか? ありがとう。

4

2 に答える 2

2

ツアー コードで try/catch を使用する方がよいと思います。

$processes = array();

$processes[] = "INSERT_QUERY_STRING"; //query1

//this loop can be turn more than 100 times

while(CONDITION) {
    //query generated here
    $processes[] = "UPDATE_QUERY_STRING"; //looping queries
}

$processes[] = "UPDATE_QUERY_STRING"; //last query

mysql_query("SET AUTOCOMMIT=0");
mysql_query("START TRANSACTION");  

$count_processes = count($processes);

for($i=0; $i < $count_processes; $i++)
{
    try {
        $q = mysql_query($processes[$i]);
        if (!$q) throw new Exception(mysql_error());
    }
    catch (Exception $e) {
        mysql_query("ROLLBACK");
        break;
    }
}

mysql_query("COMMIT");
mysql_query("SET AUTOCOMMIT=1");

コードとエラーを制御できるため、try/catch を使用する方が適切です :)

于 2013-07-17T10:17:27.367 に答える
1

トランザクションは間違いなくここに行くための最良の方法です. 予測不可能なケースをカバーするために、try-catch ステートメントに挿入クエリを配置し、$processes をトラバースするために foreach を使用します。

于 2013-07-17T10:10:21.643 に答える