Oracle队列实现

-- 核心技术点:for update

创建测试表

create table t

( id       number primary key,

processed_flag varchar2(1),

payload  varchar2(20)

);

创建函数索引

create index

t_idx on

t( decode( processed_flag, 'N', 'N' ) );

插入几条测试数据

insert into t

select r,

case when mod(r,2) = 0 then 'N' else 'Y' end,

'payload ' || r

from (select level r

from dual

connect by level <= 5)

/

方式一,通过函数返回未锁定行

创建队列获取一行数据的函数

支持Oracle8.0及以后的版本

create or replace

function get_first_unlocked_row

return t%rowtype

as

resource_busy exception;

pragma exception_init( resource_busy, -54 );

l_rec t%rowtype;

begin

for x in ( select rowid rid

from t

where decode(processed_flag,'N','N') = 'N')

loop

begin

select * into l_rec

from t

where rowid = x.rid and processed_flag='N'

for update nowait;

return l_rec;

exception

when resource_busy then null;

when no_data_found then null;

end;

end loop;

return null;

end;

/

获取未加锁的第一行数据

declare

l_rec  t%rowtype;

begin

l_rec := get_first_unlocked_row;

dbms_output.put_line( 'I got row ' || l_rec.id || ', ' || l_rec.payload );

end;

/

eoda/muphy> I got row 2, payload 2

获取未加锁的第二行数据

declare

pragma autonomous_transaction;

l_rec  t%rowtype;

begin

l_rec := get_first_unlocked_row;

dbms_output.put_line( 'I got row ' || l_rec.id || ', ' || l_rec.payload );

commit;

end;

/

eoda/muphy> I got row 4, payload 4

方式二,直接通过skip locked实现

获取未加锁的第一行数据

declare

l_rec t%rowtype;

cursor c

is

select *

from t

where decode(processed_flag,'N','N') = 'N'

FOR UPDATE

SKIP LOCKED;

begin

open c;

fetch c into l_rec;

if ( c%found )

then

dbms_output.put_line( 'I got row ' || l_rec.id || ', ' || l_rec.payload );

end if;

close c;

end;

/

eoda/muphy> I got row 2, payload 2

获取未加锁的第二行数据

declare

pragma autonomous_transaction;

l_rec t%rowtype;

cursor c

is

select *

from t

where decode(processed_flag,'N','N') = 'N'

FOR UPDATE

SKIP LOCKED;

begin

open c;

fetch c into l_rec;

if ( c%found )

then

dbms_output.put_line( 'I got row ' || l_rec.id || ', ' || l_rec.payload );

end if;

close c;

commit;

end;

/

eoda/muphy> I got row 4, payload 4

--参考自Oracle编程艺术 深入理解数据库体系结构第三版

Oracle队列实现的更多相关文章

  1. oracle 队列

    Oracle 高级队列(AQ) 适用对象:初步了解oracle高级队列人群 注意事项: 序号 注意事项 1 JMS监听部分可参考官方文档: http://docs.oracle.com/cd/e128 ...

  2. Oracle AWR报告指标全解析-11011552

    1-5 Top 5 Timed EventsWaits : 该等待事件发生的次数, 对于DB CPU此项不可用Times : 该等待事件消耗的总计时间,单位为秒, 对于DB CPU 而言是前台进程所消 ...

  3. oracle 11g RAC 的一些基本概念(四)

    RAC   在Grid Infrastructure安装完以后,我们把注意力转移到集群上的Oracle软件的安装上来.我们看到,Grid Infrasctructure提供了运行RAC的框架,包括集群 ...

  4. oracle AWR详解

    原文地址:https://blog.csdn.net/elvis_lfc/article/details/52326148 啥是AWR? =============================== ...

  5. JMS监听Oracle AQ

    该文档中,oracle版本为11g,jdk版本1.8,java项目为maven构建的springboot项目,springboot的版本为2.1.6,并使用了定时任务来做AQ监听的重连功能,解决由于外 ...

  6. ODAC(V9.5.15) 学习笔记(二)控件列表

    ODAC的控件有26个,简单介绍如下: TOraSession  管理Oracle的连接  TOraQuery  使用SQL进行数据获取,自动将更新提交数据库  TSmartQuery    在处理字 ...

  7. 2007-10的PWX OracleCdc问题解答

    1. 捕获增量的底层机制是什么?(例如日志.触发器.LogMiner) PWX利用Oracle的LogMiner来提取来自于Oracle的增量, LogMiner是由Oracle数据库提供的,如果当前 ...

  8. oracle实例恢复之检查点队列

    chain即链. oracle中链有很多种,LRU.LRUW.checkpoint queue等,都是干什么的呢??? LRU将可用块(干净的块)串起来.LRUW将脏块串起来,指导DBWR进程率先将冷 ...

  9. Oracle 中的作业队列和队列调度

    一,启动执行作业的进程       在 Oracle 中,是使用 “作业队列协调进程(CJQ0)” 这个协调数据库实例的作业队列的后台进程,来监视作业队列中的作业表(JOB$),并启动作业队列进程(J ...

随机推荐

  1. python skimage图像处理(一)

    python skimage图像处理(一) This blog is from: https://www.jianshu.com/p/f2e88197e81d 基于python脚本语言开发的数字图片处 ...

  2. 【Python】解析Python中的迭代器

    目录结构: contents structure [-] Iterator VS Iterable Itertools 模块 生成器(Generator) 在开始文章之前,先贴上一张Iterable. ...

  3. i系列标准-互联网周刊

    原文:http://www.enet.com.cn/article/2019/0429/A20190429062899.html 传统意义上的规模.现代意义上的工具时代感.永远不会改变的最高意义上的使 ...

  4. ES6 - 数组扩展(扩展运算符)

    扩展运算符 扩展运算符(spread)是三个点(...).它好比 rest 参数的逆运算(函数),将一个数组转为用逗号分隔的参数序列. rest: 变量将多余的参数放入数组中. spread(扩展): ...

  5. CentOS7下的CDH 6.2.0 安装过程

    #install OS centos 7.5#install lsb packageyum install -y redhat-lsb #install net-tools package yum i ...

  6. Java13新特性 -- 新增 移除 废弃 已知问题等

    新增 添加FileSystems.newFileSystem(Path, Map<String, ?>) Method 新的java.nio.ByteBuffer Bulk get/put ...

  7. Synchronize深入

    前言:    synchronize会使用,但是对于深层次的知识,不是很清楚,故整理一篇博客. 简介:   能够保证在同一时刻,最多只有一个线程执行该端代码,以达到保证并发安全效果. 两种用法: 对象 ...

  8. Automl基于超大数据下的数据分发方案探讨

    先定义几个关键字: 任务:用户一次上传的数据集并发起的automl任务,比如一次ocr任务,一次图像分类任务. 模型:一次任务中,需要运行的多个模型,比如ocr任务,需要ctpn模型,需要crnn模型 ...

  9. 从支付宝SDK的支付流程理解什么是公钥和私钥,什么是加密和数字签名

    ------------------- 这是自己总结: 支付宝SDK支付用到的公钥与私钥整理如下: 1.商户应用公钥    2.商户应用私钥 3.支付宝公钥 4.支付宝私钥   商户应用的公钥与私钥生 ...

  10. 打包工具Gradle

    Gradle Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具.它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML.当前其支持的语言 ...