如何在DB2中一次选择和删除队列功能

如何在DB2中一次选择和删除队列功能,db2,queue,Db2,Queue,我试图在DB2数据库中实现简单的表队列。我需要什么 是一次选择并删除表中的行,这样多个客户端将不会两次从队列中获取同一行。我在寻找类似的问题,但它们描述了另一个数据库的解决方案,或者描述了相当复杂的解决方案。我只需要立即选择并删除该行 更新:我在web上发现了如下db2子句,它与我所需要的完全相同—SELECTFROMDELETE:示例: 从旧表中选择*(从示例中删除,其中示例_id=1) 但是我想知道,如果两个concurent请求没有得到相同的结果或删除相同的行,那么这个语句是否是原子的。类

我试图在DB2数据库中实现简单的表队列。我需要什么 是一次选择并删除表中的行,这样多个客户端将不会两次从队列中获取同一行。我在寻找类似的问题,但它们描述了另一个数据库的解决方案,或者描述了相当复杂的解决方案。我只需要立即选择并删除该行

更新:我在web上发现了如下db2子句,它与我所需要的完全相同—SELECTFROMDELETE:示例: 从旧表中选择*(从示例中删除,其中示例_id=1)

但是我想知道,如果两个concurent请求没有得到相同的结果或删除相同的行,那么这个语句是否是原子的。

类似这样的内容:

SELECT COL1, COL2, ... FROM TABLE WHERE TABLE_ID = value 
     WITH RR USE AND KEEP EXCLUSIVE LOCKS;
DELETE FROM TABLE WHERE TABLE_ID = value;
COMMIT;
如果您从9.1版开始使用(大型机DB2),或者(至少从9.5版开始,搜索
数据更改表引用
),您可以使用
SELECT FROM DELETE
语句:

SELECT *
FROM OLD TABLE
  (DELETE FROM TAB1
   WHERE COL1 = 'asdf');
这将为您提供所有已删除的行


Edit:oops,刚才看到您对使用这种语句的编辑。正如他在评论中所说,两个单独的应用程序获得相同的行取决于您的操作。

我在考虑这个问题,但我想知道如果应用程序在选择和删除之间崩溃会发生什么情况。那么桌子会永远锁着吗?或者,当连接丢失时,表将立即解锁?@HPCS:这取决于创建表时定义的表锁定级别。可能只有行或页会被锁定。根据您使用的语言,异常终止应该触发任何数据库锁的自动回滚。