【发布时间】: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