目前,我们通过Java去读取数据,并更新数据时,首先会在Java代码中读取数据,再设定某些值,再去更新数据。那么有可能会有多个线程读到相同的内容,
就算在读时用for update,但在返回结果到Java时,在做更新数据之前,总会有那么一点空隙,可能会导致高并下操作数据库时访问到相同的数据。
而通过SQL中的with语法,首先更新数据,再将更新后受影响数据行放到临时表中,就可避免上述情况。
SQL代码如下:
with upt as (
update user_info set is_valid='4' WHERE id_user_info in(
select
id_user_info
from
user_info
where
is_valid in ('0', '1')
for update
)
RETURNING *
)
select
o.id_user_info as "id",
o.name,
o.age
from
upt o
本文探讨了在高并发场景下使用Java进行数据库操作时可能遇到的问题,即多个线程读取并更新相同数据导致的竞争状态。介绍了如何利用SQL中的with语法先更新数据再获取更新后的结果,以此来避免并发冲突。
464

被折叠的 条评论
为什么被折叠?



