Oracle中锁好像有排他锁,共享锁,另外还有行锁什么的.搞不太清楚.
特别是在新增记录时怎么加锁解锁?
例如下面的语句如何加锁解锁:
Insert into A表 select * from b表 where  b.callid= v_callid ;

解决方案 »

  1.   

    insert后如果不commit的话表应该就锁了吧
      

  2.   

    select * from t for update; 这个语句把select出来的都加上X锁。oracle里的X(排他锁)跟sqlserver不一样的,无论怎么样加锁,数据都是可以由其它的session读的。
    由于oracle里面读不影响写,所以共享锁就没有意义了
      

  3.   

    我查了下资料,Oracle中加锁是调用dbms_lock包来加锁的,如果rollback或commit后,就自动解锁了.我是想知道怎么才能在下面这句中加行锁.
    v_sql := 'Insert into A表 select * from b表 where  b.callid= v_callid' ;
    我目前是这样用的.
    v_locksql :='LOCK TABLE A表 IN ROW EXCLUSIVE MODE NOWAIT';
    execute immediate v_locksql; --加行锁
    execute immediate v_sql;
    commit; --解锁
      

  4.   

    一般加锁用FOR UPDATE即可。
    select * from t for update; 
      

  5.   

    存储过程中不要用加锁和解锁语句, Oracle自动根据DML语句来决定如何施加和释放锁
      

  6.   

    为什么要手工加锁??
    如果你做了事务的话,只要不commit就自动加锁了啊
      

  7.   

    个人对oracle加锁的那个包从没用过,你dml过程中就自动加锁了啊,除非你有某些特殊要求
      

  8.   

    v_locksql :='LOCK TABLE A表 IN ROW EXCLUSIVE MODE NOWAIT'; 
    这个sql是锁住A表,不让其他用户修改(但是读还是可以的)你的: Insert into A表 select * from b表 where  b.callid= v_callid
    这些插入的数据还没commit, 别人不可能访问到的。除了有主键索引方面的锁外,这些数据不存在锁的问题
      

  9.   

    目前我是用java启动了一个多线程的程序同时往A表中插入/更新记录(A表暂时没有建主键,只建了callid为索引).这样的话,不同的线程在同时往这个表插入/更新记录时,如果插入的callid已在A表中存在,则线程只做update操作否则insert操作.
    我这里如果不把A表用行锁锁住的话(行锁用不同的callid为ID,加锁)就可能同时在A表中存在多条callid相同的记录,这是我不想看到的.
    如果把A表中的callid建为主键,则多线程往A表中插入新记录时就会发生死锁.目前暂时没有好的办法解决.
      

  10.   

    9楼:你说的情况,即使用 lock table a表 in...这个语句也是没有解决的。
    不信你试试:session A:
    --------------------
    sql>truncate table a; --现在A表没有数据了
    sql>lock table a in row exclusive mode nowait;
    sql>insert into a  select * from b表 where  b.callid= 1; --用1来做测试
    sql>--现在不commit;session B:
    -------------------------------
    sql>lock table a in row exclusive mode nowait;
    sql>insert into a  select * from b表 where  b.callid= 1; --用1来做测试这之后sessionA 做commit; session B再做commit;
    现在A表的callid重复了吧?
      

  11.   


    我看不会死锁,而是会阻塞。 后面插入的同样callid的线程在commit时会报错,这时rollback就好
      

  12.   

    Insert时是不能也加不了锁的,今天终于明白了.update或delete是可以加锁的
      

  13.   

    这有一组函数,也可以用来管理锁(特殊情况下才用)
    dbms_lock.allocate_unique
    dmbs_lock.request