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