我如何在 CakePHP3 中 运行 事务进行多模型操作?

How do I run transactions in CakePHP3 for multiple model operation?

我想在多个 insert/update 查询上使用事务处理多个 model/table。

cakephp3 documentation 中有一个使用 连接管理器 execute() 方法的事务示例,但我必须使用 cakephp3 的 save() 方法进行事务.我尝试使用 save() 方法,但没有用。出现 SQL 错误,它执行所有查询并保存数据,除了 sql 错误的查询,回滚不起作用!

我的代码就像-

$connection = ConnectionManager::get('default');

$connection->transactional(function ($connection) use($inputs, $status) {
  $serviceTbl = $this->Service;
  $service = $serviceTbl->newEntity();
  $service->name = $inputs['name'];
  $service = $serviceTbl->save($service);
if($service)
 {
   $this->loadModel('SrvApiClientInfo');
   $SrvApiClientInfo = $this->SrvApiClientInfo;
   $SrvApiClient = $SrvApiClientInfo->newEntity();
   $SrvApiClient->client_name = $inputs['basic_info']['client_name'];
   $SrvApiClient->organization_name = $inputs['basic_info']['vendor_name'];
   $SrvApiClient->address = $inputs['basic_info']['address'];
   $SrvApiClient->email = $inputs['basic_info']['email'];
   $SrvApiClient->mobile = $inputs['basic_info']['mobile'];
   $SrvApiClient->phone = $inputs['basic_info']['phone'];
   $SrvApiClient->fax = $inputs['basic_info']['fax'];
   $SrvApiClient->emergency_contact_name = $inputs['basic_info']['emergency_contact_name'];
   $SrvApiClient->emergency_contact_mobile = $inputs['basic_info']['emergency_contact_mobile'];
   $SrvApiClient->emergency_contact_designation = $inputs['basic_info']['emergency_contact_designation'];
   $SrvApiClient = $SrvApiClientInfo->save($SrvApiClient);
      if($SrvApiClient){
           $this->loadModel('ServiceApiRegistration');
           $tblServiceApiRegistration = $this->ServiceApiRegistration;
              foreach($inputs['method'] as $method)
              {
              $ServiceApiRegistration = $tblServiceApiRegistration->newEntity();
              $ServiceApiRegistration->service_id = $service['service_id'];
              $ServiceApiRegistration->service_api_id = $method;
              $ServiceApiRegistration->client_id = $SrvApiClient['client_id'];
              $ServiceApiRegistration->status_id = $status['Inactive'];
              $tblServiceApiRegistration->save($ServiceApiRegistration);
              }
         }
     }
    });

仔细检查您链接的文档,尤其是“交易方法将执行以下操作”列表

的第 3 点和第 4 点

The transactional method will do the following:

[...]

  • If the closure raises an exception, a rollback will be issued. The original exception will be re-thrown.
  • If the closure returns false, a rollback will be issued.

您的代码既 returns false,也不会在出错时抛出异常,因此不会发出回滚。

如果真的有一个SQL“错误”,即在核心中触发了一个异常,那么它应该已经被事务包装器捕获,并且应该已经发出回滚。所以我怀疑要么没有例外,要么不支持回滚,或者驱动程序认为不支持回滚。