在我们的软件系统中调试问题时,我遇到了一个准备好的语句,如下所示:
"UPDATE Command SET expiredWhen=status, status='expired' WHERE id=?;"
expiredWhen
字段应设置为status
字段中的任何值,然后status
字段应设置为"已过期" 。它在我们的MySQL 5.1环境中按预期工作,但在MySQL 5.5 expiredWhen
被设置为"已过期"。
此声明的预期结果是什么?这是一个竞争条件,我们很幸运它曾经有效吗?或者此语句的定义行为是否已从版本5.1更改为5.5?
答案 0 :(得分:1)
版本5.1和5.5之间的documentation是一致的:
单表UPDATE分配通常从左到右进行评估 对。对于多表更新,无法保证 作业以任何特定顺序进行
这表明不应该成为竞争条件。也就是说,“一般”这个词有点令人担忧 - 假设可能成为竞争条件可能是最安全的。