2014-10-27 26 views
1

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

很遗憾,我的英语家伙,如果有人将编辑它,我会很感激。

回答

1

不能可靠地防止其他应用程序读取一个应用程序锁定的行。运行未定义的查询读取隔离级别的查询将能够访问甚至专门锁定的行。使用当前提交的语义,使用游标稳定性隔离级别运行的查询将访问先前版本的专用锁定行。

我觉得你最好的选择是在状态栏使用一个特殊的值(如“处理”),以防止其他会话处理同一行。

0

好吧,其实我是通过创建具有以下其中运行它的值改为true标志public static boolean busy;第一种方法解决了单,并同时它的真实第二种方法不运行。第一种方法完成后,它将其更改为false。

+2

请注意,只有您有一台服务器才能使用该功能。找到一个数据库解决方案可能是最好的。请注意,通过正确的隔离级别,如果您执行了对该行的读取,那么将在事务处理期间将其锁定以供读取,并且可以稍后进行更新。或者,您可以选择更新以使用写入意图进行读取。 – 2014-10-27 15:42:29

+0

感谢您的警告我会尽力实施这个解决方案。 – Anatoly 2014-10-28 05:36:12

1

我假设你正在使用DB2用于Linux/UNIX/Windows的,因为你没有提到的平台。

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

当指定或者RR(可重复读)的隔离级别或RS(读稳定性),你也可以说,要锁定正在读取行,无论是与一个SHAREUPDATE,或EXCLUSIVE锁。

该声明将只要交易活跃锁定该行。

相关问题