克隆Dbal连接以在重复的Get_Affected_Rows上执行插入

时间:2012-03-11 11:51:11

标签: php mysql doctrine symfony dbal

我正在使用Doctrine DBAL并希望执行返回受影响的INSERT ... ON DUPLICATE UPDATE。看起来你不能使用标准的Dbal executeUpdate,因为INSERT ... ON DUPLICATE UPDATE和affected_rows是MySQL特有的。这迫使你做一个标准的准备SQL语句。

我正在使用依赖注入将连接($ this->连接)插入到类文件中。我是否应该关注运行INSERT ... ON DUPLICATE UPDATE然后做第二次qry以在这些条件下获得受影响的人。

由于DBAL连接已建立并在每个页面请求中细分,因此似乎没有竞争情况。我在这种情况下使用Symfony2框架,但无论你使用什么框架或没有框架,答案都应该对你有用。

1 个答案:

答案 0 :(得分:1)

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

但回到我的INSERT .. ON DUPLICATE UPDATE问题,完全可以做两个背靠背的查询,因为你使用相同的连接进行两个查询,所以不会出现竞争条件的任何问题。

2个查询看起来像这样

$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