gpt4 book ai didi

mysql - 在同一事务中插入和更新同一行? (MySQL)

转载 作者:行者123 更新时间:2023-11-29 03:46:08 24 4
gpt4 key购买 nike

所以这是我的问题:

我有一个带有可选图片上传字段的文章提交表单。

当用户提交表单时——大概会发生以下情况:

if($this->view->form->isValid($_POST){

$db->beginTransaction();
try{
// save content of POST to Article table
if(!$this->_saveArticle($_POST)){
return;
}

// resize and save image using ID generated by previous condition
if(!$this->_saveImage($_FILES){
$db->rollback();
return;
}

// update record if image successfully generated
if(!$this->_updateArticle(){
$db->rollback();
}
$db->commit();
}
}catch (Exception $e){
$db->rollback()
}

所有模型都使用映射器保存,映射器通过检查代理键的存在来自动执行“UPSERT”功能

public function save($Model){
if(!is_null($Model->id_article){
$Mapper->insert($Model->getFields());
return;
}
$Mapper->update($Model->getFields(),$Model->getIdentity());
}

文章表有一个由 ID、标题和 URL 组成的复合 UNIQUE 索引。此外,我正在生成一个 UID,该 UID 在插入之前添加到模型的 ID 字段(而不是自动递增)

当我尝试执行此操作时,它对于插入到表中的第一篇文章运行良好 - 但后续调用(使用完全不同的输入)会触发 DUPLICATE KEY 错误。 MySQL 返回在条件 1 (_saveArticle) 中生成的 ID 并提示 key 已经存在...

我已经转储了模型字段(和条件状态 - 即插入 | 更新)并且它们按预期进行(伪):

inserting!
id = null
title = something
content = something
image = null

updating!
id = 1234123412341234
title = something
content = something else
image = 1234123412341234.jpg

此行数据不存在于数据库中。

我认为这可能是其中之一:

1: 我在用户登录时加载辅助数据库适配器,允许他们通过一次登录与多个站点交互 - 这可能会以某种方式混淆事务

2:是Zend事务实现中的一些描述的bug(可能由1触发)

3:我需要将 save() 替换为 INSERT ... ON DUPLICATE

4:我应该重组提交过程,或者为图像生成一个不依赖于先前插入行的 UID 的名称。

仍在寻找,但我想知道是否有其他人遇到过此类问题或可以指出解决方案的方向

最好的SWK

最佳答案

好的 - 郑重声明,这完全有可能。问题出在我的应用程序架构中。我在处理持久性的 Mapper 类中捕获异常 - 然后查询它们以返回 bool 状态,从而中断该过程。这反过来又破坏了阻止插入/更新正常工作的 try/catch 循环。总结 - 是的 - 您可以在单个事务中插入和更新同一行。我勾选了社区 wiki 以取消代表

关于mysql - 在同一事务中插入和更新同一行? (MySQL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5046635/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com