我一个存储过程中,要先查询一个表,然后根据结果做出相应操作,比如:select xx from table T
if (no record) then
insert xxx to T
else
do something else
commit
当这个存储过程被连续快速调用2次时,第一次的调用事务还没有结束,而第二次调用已经开始,所以查到表T里没有记录,所以会执行insert操作,这个是我所不希望的。我希望严格的控制,当第一次事务还没有结束时,insert操作对表T加锁,这个时候任何其他事务都不能查询,必须等待到第一次事务结束为止。不知道有没有办法实现?
if (no record) then
insert xxx to T
else
do something else
commit
当这个存储过程被连续快速调用2次时,第一次的调用事务还没有结束,而第二次调用已经开始,所以查到表T里没有记录,所以会执行insert操作,这个是我所不希望的。我希望严格的控制,当第一次事务还没有结束时,insert操作对表T加锁,这个时候任何其他事务都不能查询,必须等待到第一次事务结束为止。不知道有没有办法实现?
解决方案 »
- INS 300-60 Check for group existence failed
- win7安装oracle9i数据源
- oracle
- 为什么Enterprise Manager Console经常莫名其妙关闭
- 请教一下个位高手,我用system/manager 或 sys/change_on_install启动数据库时会出现无法处理服务名的提示,在建完数据库后还需要其他设
- >>>sql plus里怎么删除一个表结构???<<<
- 关于oracle临时表
- 关于多数数据库的问题
- !!!急!!!请问怎么触发C函数的问题?
- ORACLE DML 锁分类
- select for update的问题
- oracle创建视图
这种方式 应该实现不了需求,因为还是要查。我觉得 可以在表上加上某个字段的唯一约束,等你第二次插入的时候 就抛出个异常出来,避免第二次的操作commit。
lock table t in exclusive mode;
--在你的select xx from table t前加句
update t set xx=xx where 1=2;
select xx from table T;