java—使用单个sql命令获取值,然后更新该值

ryevplcw  于 2021-08-01  发布在  Java
关注(0)|答案(1)|浏览(303)

主要问题
是否有一个sql命令可以从表行中选择一个值,并在同一个sql命令中更新该值?
更详细的问题
我在一个电子商务网站上工作,在那里我使用mysql数据库,它有一个 products 表,该表包含等待它的产品列表。
本表包括 quantity 字段和a sold 现场。
这个 quantity 表示所生产产品的总量,以及 sold 是该产品的当前销售量/用户购买量。
所以如果 sold 字段是否与 quantity 我想更新前端的html,以表明它是脱销。
因此,当用户购买“x”数量的产品时,我知道我可以执行以下两个sql命令来更新 sold 字段: SELECT sold FROM products WHERE productID = ? 我要倒满它 ? 使用刚购买的产品的id。
在得到那个之后 sold 值,然后执行更新命令,例如: UPDATE products SET sold = ? WHERE productID = ? 执行两个不同的sql命令是最好的方法吗?或者最好将其合并到一个sql命令中?
另外,我怎样才能最好地锁定这个特定的 product 在表中使用sql语句,以便如果用户a在用户b购买同一产品的同时购买产品“xyz”,则该产品不存在竞争条件 sold 要更新的字段?
更新:我正在使用java与mysql数据库通信。

mwg9r5ms

mwg9r5ms1#

最好将其作为两个独立的sql语句来执行。事实上,这是必要的。
你这样做:

START TRANSACTION; 

SELECT sold FROM products WHERE productID = ? FOR UPDATE;

UPDATE products SET sold = ? WHERE productID = ?;

COMMIT;

(这些都是sql语句,但如何将其应用于java或其他任何编程语言取决于您自己。也可能有java方法用于启动事务和提交,它们做同样的事情,所以可以使用它们。)
这个 FOR UPDATE 获取所检查行上的锁,与 UPDATE . 锁一直保持到事务提交为止。因此,您可以更新它,而不必担心并发会话的竞争条件。
但是要确保选择、更新和提交都是及时的。我看到许多开发人员做选择。。。对于更新,然后在更新和更新之间,他们的应用程序执行一堆其他代码,包括可能需要一段时间的事情,比如调用其他服务的api。您希望毫不延迟地进行提交,因为锁将使其他并发会话等待。

相关问题