执行以下sql经常会发生锁TBL_PRODUCT_PRINT 表,请大家帮我看看到底是因为什么原因?
UPDATE TBL_PRODUCT_PRINT BBB SET SELECT_FLAG=(CASE WHEN CUSTOMER_CODE IN ('C000000219') THEN 'Y' ELSE 'N' END)  
WHERE EXISTS (  
SELECT  A.CUSTOMER_CODE AS ACCEPT_CODE  
FROM TBL_REQUEST A, TBL_CUSTOMER C, TBL_ACCEPT F    , TBL_ISSUE G   
WHERE A.ACCEPT_CODE=BBB.ACCEPT_CODE AND A.CUSTOMER_CODE = C. CUSTOMER_CODE  AND A.ACCEPT_CODE = F.ACCEPT_CODE AND F.ACCEPT_TYPE='1'  AND F.PRODUCT_ENV = 'Y'    AND A. ISSUE_ID = G.ISSUE_ID AND G.ISSUE_STATUS = 'Y'   AND G.CONFIRM_STATUS = 'Y'     
AND A.MEDIA_CODE = 'M006'     AND A.ISSUE_DATE = to_date('2006/03/03','yyyy/mm/dd')   
AND NOT EXISTS ( SELECT 1 FROM TBL_PRODUCT_PRINT WHERE TBL_PRODUCT_PRINT.CUSTOMER_CODE = A.CUSTOMER_CODE) 
UNION  
SELECT  A.CUSTOMER_CODE AS ACCEPT_CODE  
FROM TBL_PRODUCT_PRINT A, TBL_AREA B, TBL_CUSTOMER C, TBL_REQUEST D,  TBL_ACCEPT F   WHERE A.CUSTOMER_CODE=BBB.CUSTOMER_CODE AND A.CUSTOMER_CODE = C. CUSTOMER_CODE  AND months_between(SYSDATE,A.CREATE_DATE)<=1   AND D.ACCEPT_CODE = F.ACCEPT_CODE AND F.ACCEPT_TYPE='1' AND F.PRODUCT_ENV = 'Y'  AND A.CUSTOMER_CODE = D.CUSTOMER_CODE AND A.MEDIA_CODE = D.MEDIA_CODE AND A.ISSUE_DATE = D.ISSUE_DATE    AND A.MEDIA_CODE = 'M006'     AND A.ISSUE_DATE = to_date('2006/03/03','yyyy/mm/dd')   
)

解决方案 »

  1.   

    很奇怪,这个sql在我的机器上执行肯定锁表,但是在别人机器上执行却好好的。
      

  2.   

    有啊,看看v$lock,v$lock_object看琐的内容,锁的问题一般和应用有关,很难找
      

  3.   

    “这个sql在我的机器上执行肯定锁表,但是在别人机器上执行却好好的”,请问你的机器和别人的机器都只是客户端吧?这个sql是在什么工具中执行的?重起机器是重起你的机器吗?
      

  4.   

    是的,我和我的同事都是在本机的java程序中连接到数据库服务器来执行此sql,前天晚上搞了一晚上我的机器上始终是锁表,昨天早上来我的机器一开机,执行却是好好的,很奇怪.
    使用的连接方式是jdbc:oracle:thin
      

  5.   

    又出现了锁表的情况,不过这次锁的是另外一张,也是sql比较复杂的一个update的sql.并且这个update的sql与上次同样也是存在事务中的sql之一.
    从会话中只能看是web服务器锁住了表,我们都是通过客户端操作tomcat服务器来写数据库.解锁表之后,试了很多次却再也无法重现了
      

  6.   

    你首先要知道为什么会锁表,一般情况就是你要更新的记录被其它会话check out并尚未commit或rollback。问题并不是由于不同的机器造成的。先考虑简单的情况,排除可能后再考虑更深层次的,90%的错误都是由于简单的操作失误造成的。
      

  7.   

    一般情况就是你要更新的记录被其它会话check out并尚未commit或rollback。
      

  8.   

    要更新的记录被其它会话check out,那应该是等待其它会话的commit或者rollback啊.怎么能把整张表都锁了呢