我有一个适用于数据库表的应用程序
Id, state, procdate, result
当需要处理某些数据时,应用会将状态设置为PROCESSING
。处理完毕后,处理结果设置为result
列,状态转为STANDBY
。
要将第一个设置设为PROCESSING
,我启动事务,执行select for update
,然后更新状态并进行更新。
然后我完成工作并使用selection for update
更新状态和结果。
处理时间可能长达5分钟。需要状态切换才能查看正在进行的行数。问题是可能发生另一个处理请求,它必须等到第一个处理结束。 所以我想保持行锁定。如果我在提交处理状态后立即进行选择以进行锁定,则第二个请求可能会拦截并锁定该行。
那么我怎样才能保持锁定并提交更改?
答案 0 :(得分:0)
您需要在设计中处理此问题。这是一个想法。
这允许第二个进程选择新的“READY”记录并将它们设置为自己的处理,而不会干扰已经运行的进程。
答案 1 :(得分:0)
这是我采取的两种方法。 (我提供了第三种方法,但从未采取这种方法。)
1)为什么在提交更改后不退出事务。
2)如果选项1不可行,那么您可以简单地:
3)如果绝对没有必要在提交过程中获得锁,那么您实际上可以锁定另一个对象。我承认,我从来没有采用这种方法,但是它如下:
初始阶段
提交更改的阶段
我从不需要这种逻辑,而且我真的不喜欢它,因为它需要该表的GLOBAL锁定对象。同样,这取决于您的代码,以及能够在仍在事务中进行更改的人员的重要性。
但是,只需确保在提交更改后退出交易时就不会对代码进行镀金处理,对您的涉众来说就可以了。