【问题标题】:How do I run transactions in CakePHP3 for multiple model operation?如何在 CakePHP3 中运行事务以进行多模型操作?
【发布时间】:2016-03-07 10:51:51
【问题描述】:

我想在多个模型/表的多个插入/更新查询中使用事务。

cakephp3 documentation 中有一个使用 connection manager 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);
              }
         }
     }
    });

【问题讨论】:

  • "不起作用" 不是正确的问题描述!请更具体地说明究竟会发生什么,以及您期望会发生什么。同时显示您的调试尝试。
  • 出现sql错误,保存所有数据但回滚无效!
  • 您的完整事务代码是什么样的?您正在使用哪种 DBMS 和可能的存储引擎?
  • 我正在使用 mysql 和存储引擎 innodb。我已经提到了代码,完整的代码太大了。我只是在一些表中插入数据,比如服务表操作。
  • 它是否很大并不重要,它负责触发回滚,因此对于问题至关重要。

标签: cakephp transactions cakephp-3.0


【解决方案1】:

仔细检查您链接的文档,尤其是“事务方法将执行以下操作”列表的第 3 点和第 4 点

事务方法将执行以下操作:

[...]

  • 如果闭包引发异常,将发出回滚。原来的异常将被重新抛出。
  • 如果闭包返回 false,将发出回滚。

您的代码既不会返回false,也不会在出现问题时抛出异常,因此不会发出回滚。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-12
    • 2021-12-03
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 2021-09-10
    • 2018-01-24
    相关资源
    最近更新 更多