Rumah > Soal Jawab > teks badan
Saya ada kod:
$tx = Yii::$app->db->beginTransaction(); try { // CODE (a lot of active-record reads and writes) $tx->commit(); echo "All good!"; } catch (\Throwable $ex) { $tx->rollback(); echo "Error"; }
Ia dilaksanakan dan saya mendapat "Semuanya baik-baik saja!" Walau bagaimanapun, tiada apa yang sebenarnya disimpan dalam pangkalan data. Kod ini telah berjalan selama beberapa bulan sekarang tanpa pengubahsuaian. Ia tiba-tiba berhenti berfungsi semalam.
Selepas sejam menyahpepijat, saya boleh mengesahkan bahawa operasi berfungsi dengan betul dan saya boleh "bergema" hasil perantaraan, termasuk ID rekod yang ingin saya masukkan. Tetapi selepas penyerahan akhir, tiada apa yang disimpan dalam pangkalan data.
Jika saya mengalih keluar transaksi, kod itu berfungsi dan semuanya disimpan dalam pangkalan data seperti biasa dengan transaksi.
Saya ingin memastikan integriti perubahan dan ingin kembali ke dalam transaksi. Atau, sekurang-kurangnya, saya ingin memahami kod (atau keadaan pangkalan data atau apa sahaja) yang menghalang data daripada disimpan, dan mengapa saya tidak mendapat sebarang pengecualian dan menggemakan "ralat" kerana transaksi tidak dapat dilakukan.
Saya pasti bahawa kaedah commit() akan mengeluarkan pengecualian jika komit transaksi gagal (sebenarnya menulis ke pangkalan data), tetapi itu tidak berlaku. Adakah terdapat cara untuk mendapatkannya?
Terima kasih banyak-banyak terlebih dahulu.
P粉7153042392024-03-31 09:04:28
Masalahnya ialah dengan kod. Terima kasih, @Michal Hynčica, anda memang betul. Ada bahagian seperti ini:
foreach (..) { $tx = Yii->$app->db->beginTransaction(); if ($oneRareCondition) { continue; } ... $tx->commit(); }
Oleh di continue;
之前添加 $tx->commit();
解决了这个很少发生的 if
:
foreach (..) { $tx = Yii->$app->db->beginTransaction(); if ($oneRareCondition) { $tx->commit(); continue; } ... $tx->commit(); }