使用 CodeIgniter 在多个模型函数上进行单个事务
Single transaction on multiple model function with CodeIgniter
我需要插入 2 tables 如果在插入任何 table 我想回滚提交的查询时出现任何问题。
我在控制器中写了查询
例如:
$this->db->trans_start();
$this->db->insert_batch('market_users_mapping', $marketData);
$this->db->insert_batch('maincategory_users_mapping', $maincategoryData);
$this->db->trans_complete();
if ($this->db->trans_status() === FALSE) {
throw error
}
这非常有效。但我认为在控制器内部编写查询不是一个好习惯。所以我这样做了,称为模型函数,我在各自的模型函数中编写了那些 insert_batch 查询。
$this->db->trans_start();
$this->maincategory_model->function_name()
$this->market_model->function_name();
$this->db->trans_complete();
if ($this->db->trans_status() === FALSE) {
throw error
`enter code here`
}
但这并没有像预期的那样工作
您更改了这些示例中有关名称的查询位置,以防万一。我认为你不能在不同方法之间绑定事务(你的第二个例子)。但是您可以而且应该将您的数据库相关代码设置为模型。
所以在模型中进行这些查询:
// controller code
$this->db->trans_start();
$this->maincategory_model->first_function($maincategoryData);
$this->market_model->second_function($marketData);
$this->db->trans_complete();
if ($this->db->trans_status() === FALSE) {
throw error
`enter code here`
}
// Maincategory_model code
public function first_function($maincategoryData)
{
return $this->db->insert_batch('maincategory_users_mapping', $maincategoryData);
}
// Market_model code
public function second_function($marketData)
{
return $this->db->insert_batch('market_users_mapping', $marketData);
}
先将你的db相关操作转移到模块中,然后再开始事务。
模块中的示例代码,
First module :
function insert_data_market_maincategory($marketData,$maincategoryData)
{
$status = TRUE;
$this->db->trans_start();
$this->db->insert_batch('market_users_mapping', $marketData);
$this->second_module_name->maincategoryData($maincategoryData)
$this->db->trans_complete();
if ($this->db->trans_status() === FALSE) {
$status = FALSE;
}
return $status;
}
second module :
function maincategoryData($data)
{
$this->db->insert_batch('table_name', $data);
}
你的控制器调用这个函数
控制器中的示例代码,
function inser_user_data()
{
$result = $this->module_name->maincategoryData($marketData,$maincategoryData)
if($result == FALSE)
{
throw error
`enter code here`
}
else
{
//data inserted successfully
}
}
我正在使用 CI 3,我可以在控制器中的多个模型上使用单个事务。
我尝试插入错误数据测试是否回滚,事务回滚成功
我没有使用 Tpojka 的答案,而是使用了我的 模型方法 return true 或 false。一切似乎都还好。
我需要插入 2 tables 如果在插入任何 table 我想回滚提交的查询时出现任何问题。
我在控制器中写了查询 例如:
$this->db->trans_start();
$this->db->insert_batch('market_users_mapping', $marketData);
$this->db->insert_batch('maincategory_users_mapping', $maincategoryData);
$this->db->trans_complete();
if ($this->db->trans_status() === FALSE) {
throw error
}
这非常有效。但我认为在控制器内部编写查询不是一个好习惯。所以我这样做了,称为模型函数,我在各自的模型函数中编写了那些 insert_batch 查询。
$this->db->trans_start();
$this->maincategory_model->function_name()
$this->market_model->function_name();
$this->db->trans_complete();
if ($this->db->trans_status() === FALSE) {
throw error
`enter code here`
}
但这并没有像预期的那样工作
您更改了这些示例中有关名称的查询位置,以防万一。我认为你不能在不同方法之间绑定事务(你的第二个例子)。但是您可以而且应该将您的数据库相关代码设置为模型。
所以在模型中进行这些查询:
// controller code
$this->db->trans_start();
$this->maincategory_model->first_function($maincategoryData);
$this->market_model->second_function($marketData);
$this->db->trans_complete();
if ($this->db->trans_status() === FALSE) {
throw error
`enter code here`
}
// Maincategory_model code
public function first_function($maincategoryData)
{
return $this->db->insert_batch('maincategory_users_mapping', $maincategoryData);
}
// Market_model code
public function second_function($marketData)
{
return $this->db->insert_batch('market_users_mapping', $marketData);
}
先将你的db相关操作转移到模块中,然后再开始事务。
模块中的示例代码,
First module :
function insert_data_market_maincategory($marketData,$maincategoryData)
{
$status = TRUE;
$this->db->trans_start();
$this->db->insert_batch('market_users_mapping', $marketData);
$this->second_module_name->maincategoryData($maincategoryData)
$this->db->trans_complete();
if ($this->db->trans_status() === FALSE) {
$status = FALSE;
}
return $status;
}
second module :
function maincategoryData($data)
{
$this->db->insert_batch('table_name', $data);
}
你的控制器调用这个函数
控制器中的示例代码,
function inser_user_data()
{
$result = $this->module_name->maincategoryData($marketData,$maincategoryData)
if($result == FALSE)
{
throw error
`enter code here`
}
else
{
//data inserted successfully
}
}
我正在使用 CI 3,我可以在控制器中的多个模型上使用单个事务。 我尝试插入错误数据测试是否回滚,事务回滚成功
我没有使用 Tpojka 的答案,而是使用了我的 模型方法 return true 或 false。一切似乎都还好。