ThinkPHP 6 多模型下事務處理

  • 2020 年 1 月 21 日
  • 筆記

mysql下,事務不是針對某個特定的表或者特定的模型的,因此在多模型的情況下,不需要針對每個模型分別startTranscommitrollback。即使模型中有繼承startTrans方法,可以通過Model::startTrans();啟動事務,但其作用等同於Db:startTrans();。因此可以直接寫為以下形式。

通過測試,在出現異常時,通過圖中自增值可看出(自增值在rollback時也會增加),三個模型嘗試新增數據都被rollback。同時把Table3中的name欄位改為test233的操作也沒有成功。

<?php  namespace appcontroller;    use appBaseController;  use appmodelTable1;  use appmodelTable2;  use appmodelTable3;    use thinkException;  use thinkfacadeDb;    class Test extends BaseController  {      public function index(){          Db::startTrans();          try{              $table1 = new Table1();              $table1->save([                  'name' => 'test1'              ]);                $table2 = new Table2();              $table2->save([                  'name' => 'test2'              ]);                $table3 = new Table3();              $table3->save([                  'name' => 'test3'              ]);                $test = Table3::where('name', 'test3')->find();              $test->name = 'test233';              $test->save();                throw new Exception('test exception');              Db::commit();          } catch (Exception $e) {              Db::rollback();          }      }  }