我有一个资源表(比如说汽车),我想以原子的方式声明。然后我想知道我刚刚申请了哪些资源。
如果每个用户只能有一个资源,那么我可以做以下操作:

UPDATE cars SET user = 'bob' WHERE user IS NULL LIMIT 1
SELECT * FROM cars WHERE user = 'bob'

这样,我原子地声明资源,然后我可以看到刚才声明的行。
当“Bob”可以申请多辆车时,这不起作用。我意识到我可以得到一份Bob已经认领的汽车清单,再认领一辆,然后再次SELECT查看发生了什么变化,但这感觉很糟糕。
我想知道的是,有没有什么方法可以查看我上次更新的行?
如果不能做到这一点,是否还有其他的诀窍可以原子地要求争吵?我真的想避免使用SERIALIZABLE隔离级别。如果我这样做:
1 SELECT id FROM cars WHERE user IS NULL
2 <here, my PHP or whatever picks a car id>
3 UPDATE cars SET user = 'bob' WHERE id = <the one i picked>

这里REPEATABLE READ足够吗?换句话说,是否可以保证其他一些事务不会声明我的软件在步骤2中选择的行?

最佳答案

更新cars设置user='bob',其中id=123,user为空;
更新查询返回更改的行数。如果它没有更新,你知道这辆车已经被别人认领了。
或者,可以使用Select…更新。

关于mysql - 如何在mysql中使用UPDATE原子声明行或资源,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2460707/

10-11 22:33
查看更多