時々 (1 ~ 3 か月に 1 回) トランザクションが 2 回実行され、その結果、データが DB に 2 回入力されるという問題があります。
何が起こっているのかの要点は次のとおりです。
function foo()
{
$arr = getsomeArray();
$db = JFactory::getDbo();
try
{
bar($arr);
}
catch(Exception $e)
{
$db->transactionRollback();
}
}
function bar($arr)
{
$db = JFactory::getDbo();
$db->transactionStart();
// series of inserts and updates
// but if any fail, then throw Exception
$db->transactionCommit();
return true;
}
ここで、foo() の $arr には一意の値が含まれている必要があります。このコードは、特定のエントリが既に存在するかどうかをチェックすることで、重複するエントリが DB に挿入されるのを防ぎます。
基本チェックが機能することをテストするために、同じ値が 2 つ含まれるように $arr をモックしました。期待どおりに例外を受け取ります。
しかし、私はまだDBに二重のエントリを取得しており、それがどのように可能であるかについて困惑しています. タイムスタンプは、1 つのトランザクションが複製され、両方が並行して実行されていることを示しています。この特定の問題に関するヘルプを見つけることができませんでした。これは、主に発生するはずがないためです。
transactionStart
Joomla/PHPで 、transactionCommit
、およびを 1 つの関数で使用するトランザクションに関するすべての例を見てtransactionRollback
きましたが、継承したコードでは 2 つの異なる関数に分割されています。これにより、トランザクションが 2 回実行されるなどの問題が発生しますか?