Rumah > Soal Jawab > teks badan
Selepas PHP mengendalikan DB, ia akan meminta antara muka API dua perkhidmatan lain. Sekarang ada soalan, jika permintaan gagal, bagaimana untuk melancarkan DB? Kaedah selain daripada melancarkan pangkalan data
天蓬老师2017-05-16 13:15:11
Secara terang-terang, ia adalah masalah pengaturcaraan Jika ia berdasarkan transaksi, ia boleh:
function save_if_success($transaction, $result)
{
if ($result) $transaction->commit();
else $transaction->rollback();
}
$db_ret = db();
save_if_success($transaction, api1($db_ret) && api2($db_ret));
Kelemahannya ialah ia hanya boleh melancarkan semula pangkalan data
Secara amnya, lebih baik untuk melaksanakan logik buat asal sendiri, yang boleh membuat asal kedua-dua operasi pangkalan data dan operasi API Sangat mudah untuk menggunakan pengecualian
function revoke_if_failed($do_func, $do_func_params, $revoke_callback, $revoke_params, $exception) {
try
{
$do_func_ret = call_user_func_array($do_func, $do_func_params);
}
catch($exception $e)
{
call_user_func_array($revoke_callback, $revoke_params);
throw;
}
return $do_func_ret;
}
try
{
$dbret = db();
$api1_ret = revoke_if_failed(api1, [$dbret], revoke_db, [$dbret], OperationFailedException::class);
revoke_if_failed(api2, [$api1_ret], revoke_api1, [$api1_ret], OperationFailedException::class);
}
catch (OperationFailedException $e)
{
return ERR;
}
return SUCCESS;
Boleh juga digunakan secara gabungan
淡淡烟草味2017-05-16 13:15:11
Bukankah DB sekadar pangkalan data?
Saya tidak pernah menemui soalan berkaitan, jadi saya akan mengambil kebebasan untuk menjawab:
Adakah mungkin untuk menjana tanda untuk setiap operasi dan meletakkannya dalam cache (atau pelbagai media storan Ini mempunyai tempoh sah langkah tidak dilaksanakan selepas tempoh sah, ia akan digulung semula (operasi logik)
某草草2017-05-16 13:15:11
(@ο@) Wow~, ia melibatkan masalah perkara yang diedarkan Mari kita lihat bagaimana pakar menyelesaikan pelbagai RPC