ThinkPHP 6 多模型下事務處理
- 2020 年 1 月 21 日
- 筆記
mysql下,事務不是針對某個特定的表或者特定的模型的,因此在多模型的情況下,不需要針對每個模型分別startTrans
、commit
和rollback
。即使模型中有繼承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(); } } }