我有一个资源表(比如说汽车),我想以原子方式声明它。然后我想要有关我刚刚声明的资源的信息。
如果每个用户只能使用一种资源,我可以采取以下技巧:
UPDATE cars SET user = 'bob' WHERE user IS NULL LIMIT 1
SELECT * FROM cars WHERE user = '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>
would REPEATABLE READ
这里就足够了吗?换句话说,我能否保证其他一些事务不会声明我的软件在第 2 步中选择的行?
UPDATE cars SET user = 'bob' WHERE id = 123 AND user IS NULL;
更新查询返回更改的行数。如果没有更新,您就知道该车已被其他人认领。
或者,您可以使用 SELECT ... FOR UPDATE。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)