我可以锁定DB2行进行读取吗?

时间:2014-10-27 08:52:45

标签: java java-ee db2 ejb

我在同一行上执行的调度进程很少。实际上这一行是需要发送的短信。第一个进程是@Asynchronious进程,当我按下发送按钮时调用它,第二个进程是@Scheduled进程,每分钟调用一次。在我将数据库写入数据库之后,它的状态为0.在我成功或不成功发送之后,它将具有相应的状态2或3。当我从DB2读取SMS但在实际发送它之前第二个进程可以读取并发送它时的问题。所以,我的问题如何防止它?我可以锁定特定行进行阅读吗?另一种方法是在读取特定行时添加其他状态“处理”并更改此状态,但我怀疑是否可以同时读取和写入?我虽然也关于全局标志,这将表明这个过程无法运行,但我不只是寻找解决方案,我也在寻找最正确的解决方案。非常感谢你!

对不起我的英国人,如果有人会编辑它,我将不胜感激。

3 个答案:

答案 0 :(得分:1)

我假设您正在使用DB2 for Linux / Unix / Windows,因为您没有提及平台。

有一种方法可以让DB2在SELECT上锁定一行,请参阅this Information Center page上的isolation-clauselock-request-clause

当指定RR(可重复读取)或RS(读稳定性)的隔离级别时,您还可以说要锁定已读取的行,或者使用{{ 1}},SHAREUPDATE锁定。

只要事务处于活动状态,该语句就会锁定该行。

答案 1 :(得分:1)

您无法可靠地阻止其他应用程序读取由一个应用程序锁定的行。使用未提交的读取隔离级别运行的查询将能够访问甚至是独占锁定的行。使用当前已提交的语义以游标稳定性隔离级别运行的查询将访问以前版本的独占锁定行。

我认为您最好的选择是在状态列中使用特殊值(例如'处理')以防止其他会话处理同一行。

答案 2 :(得分:0)

好吧,我实际上通过创建一个带有以下标志public static boolean busy;第一个方法的单例来解决它,该方法运行时将其值更改为true,而它是真正的第二个方法不运行。第一种方法完成后,将其更改为false。