我有一个用例,我从表中读取一组记录,对其执行一些操作,然后更新记录。我希望在此期间没有其他应用程序/组件能够读取记录。这是因为我想在多个主机上运行相同的应用程序以实现可伸缩性,但不希望发生竞争条件。我的应用程序使用一些SQS更改事件并将它们应用于oracle存储。请建议使用什么机制。 SELECT FOR UPDATE会在这种情况下工作吗?
答案 0 :(得分:2)
选择更新会锁定行并保留它以供您更新,但不会阻止其他人阅读。我想你可能想重新考虑这个想法。想象一下,根据有多少人碰巧看到某些数据而不管他们是否决定更新数据,表格中的所有报告或所有查询都有不一致的数字?
或者,如果其他用户查询但无法查看该行 - 他们是否会尝试插入该行,您是否最终会遇到一个唯一的键约束或处理重复的数据?
或者,如果我查询一次并查看它,然后重新查询并且它会消失,因为其他人查询它 - 我对应用程序有多大的信心?
当某人去度假但忘记关闭应用程序时会发生什么 - 留下"失踪"一周为其他人排队?
你可能想研究乐观锁定以应对竞争条件。是的,这是实现的工作,但比提供不一致结果的应用程序更好!或者,您可以在两种模式下操作屏幕 - 显示和编辑。用户点击"编辑"然后重新获取FOR UPDATE,执行编辑,然后提交更改或放弃编辑。但是,这种技术的使用越来越少,因为如果事务处于未解决的状态,它可能经常会使行甚至整个表都被锁定,这可能需要DBA干预才能解决。