克隆数据库连接以对重复的Get_Affected_Rows执行插入操作


Clone Dbal Connection for doing Insert on Duplicate Get_Affected_Rows

我正在使用Doctrine DBAL,并希望执行一个返回为affected_rows的INSERT ... ON DUPLICATE UPDATE。似乎您不能使用标准的Dbal executeUpdate,因为INSERT ... ON DUPLICATE UPDATE和affected_rows是MySQL特定的。这迫使您执行一个标准的SQL语句。

我正在使用依赖项注入将连接($this->connection)插入到类文件中。我是否应该考虑在这些条件下运行INSERT ... ON DUPLICATE UPDATE,然后进行第二次qry以获得affected_rows。

由于DBAL连接是在每个页面请求上建立和断开的,因此似乎没有出现竞争情况。在这种情况下,我使用的是Symfony2框架,但无论您使用的是什么框架或没有框架,答案都应该对您有所帮助。

在这种情况下,没有理由担心克隆对象/服务。至少在Symfony2(SF2)框架中,大多数服务只在请求期间持续存在。因此,我担心在另一个请求中影响或交叉用户体验是不成问题的。

但回到我的INSERT .. ON DUPLICATE UPDATE问题,背靠背执行两个查询是完全可以的,并且由于您使用相同的连接来执行两个询问,因此竞争条件不会有任何问题。

两个查询如下

$sql1 = "INSERT INTO table (...) VALUES (..) ON DUPLICATE KEY UPDATE ...";
$sql2 = "SELECT ROW_COUNT()";
// Expected Results for $sql2
// 0 = no updates
// 1 = new insert
// 2 = update