ThinkPHP5中的事務操作

somehow1002發表於2017-09-27

官方手冊裡的事務操作
1.自動控制事務處理(匿名函式方式)

Db::transaction(function(){
    Db::table('think_user')->find(1);
    Db::table('think_user')->delete(1);
});

2.手動控制事務

// 啟動事務
Db::startTrans();
try{
    Db::table('think_user')->find(1);
    Db::table('think_user')->delete(1);
    // 提交事務
    Db::commit();
} catch (\Exception $e) {
    // 回滾事務
    Db::rollback();
}

除了官方推薦方式,我們也可以另外使用模型來控制事務

$test1Model=new Test1Model;
$test2Model=new Test2Model;

$test1Model->startTrans();
try{
    $test1Model->where('id','eq',1)->delete();
    $test2Model->where('id','eq',1)->delete();

    $test1Model->commit();
}catch(\Exception $e){
    $test1Model->rollback();
}

需要注意的幾個方面是

  1. 使用事務處理的話,需要資料庫引擎支援事務處理。 比如 MySQL 的MyISAM 不支援事務處理,需要使用InnoDB 引擎
  2. 注意在事務操作的時候,確保你的資料庫連線是相同的
  3. 業務上的出錯和資料庫操作的出錯是不同的,你可能需要自己捕獲業務上的出錯資訊

相關文章