目前,我们通过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