ThinkPHP 封裝了事務操作方法,支援多模型數據一致性保障。本文展示標準事務代碼結構及必要條件。
$m = D('YourModel'); // 或 M()
$m2 = D('YourModel2');
$m->startTrans(); // 啟動事務(任一模型調用即可)
$result = $m->where('刪除條件')->delete();
$result2 = $m2->where('刪除條件')->delete();
if ($result && $result2) {
$m->commit(); // 提交事務
} else {
$m->rollback(); // 回滾事務
}
startTrans()、commit()、rollback() 均為模型實例方法try-catch)MySQL 必須使用 InnoDB 或 BDB 存儲引擎,MyISAM 不支援事務,操作將靜默失效(不報錯但不回滾)。
-- 檢查表引擎
SHOW TABLE STATUS LIKE 'your_table';
-- 修改引擎
ALTER TABLE your_table ENGINE=InnoDB;
try {
$m->startTrans();
// 多步業務邏輯
$m->save($data1);
$m2->save($data2);
$m3->delete($id);
$m->commit();
} catch (\Exception $e) {
$m->rollback();
// 記錄日誌、拋出業務異常
}