我一个存储过程中,要先查询一个表,然后根据结果做出相应操作,比如:select xx from table T
if (no record) then
insert xxx to T
else
do something else
commit
当这个存储过程被连续快速调用2次时,第一次的调用事务还没有结束,而第二次调用已经开始,所以查到表T里没有记录,所以会执行insert操作,这个是我所不希望的。我希望严格的控制,当第一次事务还没有结束时,insert操作对表T加锁,这个时候任何其他事务都不能查询,必须等待到第一次事务结束为止。不知道有没有办法实现?

解决方案 »

  1.   

    select * from table T for update 
      

  2.   


    这种方式 应该实现不了需求,因为还是要查。我觉得 可以在表上加上某个字段的唯一约束,等你第二次插入的时候  就抛出个异常出来,避免第二次的操作commit。
      

  3.   


    lock table t in exclusive mode;
    --在你的select xx from table t前加句
    update t set xx=xx where 1=2;
    select xx from table T;