软件流程有个概念,叫 缓冲更新,又叫乐观性锁定,专门应对你这种情况 大概是这种流程 -- 前期select 不锁定 select SOME_id from xxxx where id=xxxx ---交互性操作, 把SOME_ID保存成一个变量old_id-- 需要更新时,比较旧值和当前值,如果当前值和旧值不一样,说明数据已被其他用户更新,更新失败BEGIN TRANSACTION select SOME_id from xxxx where id=xxxx FOR UPDATE if some_id<>old_id -- 如果当前值和旧值不一样,说明数据已被其他用户更新,更新失败 rollback return endif update xxx set some_id=new_id where id=xxxx commit你应该把以上事务做成存储过程, 把旧值当做一个变量输入
大概是这种流程
-- 前期select 不锁定
select SOME_id from xxxx where id=xxxx
---交互性操作, 把SOME_ID保存成一个变量old_id-- 需要更新时,比较旧值和当前值,如果当前值和旧值不一样,说明数据已被其他用户更新,更新失败BEGIN TRANSACTION
select SOME_id from xxxx where id=xxxx FOR UPDATE
if some_id<>old_id
-- 如果当前值和旧值不一样,说明数据已被其他用户更新,更新失败
rollback
return
endif
update xxx set some_id=new_id where id=xxxx
commit你应该把以上事务做成存储过程, 把旧值当做一个变量输入