在调试我们的软件系统中的问题时,我遇到了一个准备好的语句,如下所示:
"UPDATE Command SET expiredWhen=status, status='expired' WHERE id=?;"
expiredWhen
字段应该设置为 status
字段中的任何值,然后应该设置 status
字段到“过期”。它在我们的 MySQL 5.1 环境中按预期工作,但在 MySQL 5.5 中 expiredWhen
被设置为“expired”。
此声明的预期结果是什么?这是一个竞争条件吗?我们很幸运它曾经有效过?或者此语句的定义行为是否从版本 5.1 更改为 5.5?
最佳答案
documentation版本 5.1 和 5.5 之间是一致的:
Single-table UPDATE assignments are generally evaluated from left to right. For multiple-table updates, there is no guarantee that assignments are carried out in any particular order
这表明它不应该成为竞争条件。也就是说,“一般”这个词有点令人担忧 - 最安全的假设是它可能是一个竞争条件。
关于MySQL - 克隆然后更改字段 - 这是竞争条件吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31998735/