DB2 SELECT FOR UPDATE with internal JOIN

DB2 SELECT FOR UPDATE with internal JOIN,select,db2,sql-update,deadlock,Select,Db2,Sql Update,Deadlock,我正试图解决一个DB2问题。我根据以前的Select进行更新,当两个事务并行运行Select时,偶尔会遇到死锁,并且之后都无法更新 所以我试图用selectforupdate来解决这个问题,但是很明显,selectforupdate不适用于内部连接,对吗?有办法解决吗 这是我的选择声明 SELECT s.ID FROM DATA.TABLE_A s INNER JOIN DATA.TABLE_B n ON s.ID = n.ID WHERE n.N_ID = ?

我正试图解决一个DB2问题。我根据以前的Select进行更新,当两个事务并行运行Select时,偶尔会遇到死锁,并且之后都无法更新

所以我试图用selectforupdate来解决这个问题,但是很明显,selectforupdate不适用于内部连接,对吗?有办法解决吗

这是我的选择声明

SELECT s.ID FROM DATA.TABLE_A s 
    INNER JOIN DATA.TABLE_B n ON s.ID = n.ID 
    WHERE n.N_ID = ? 
        AND n.N_TYPE = ? 
        AND n.PN_ID = ? 
        AND n.PN_TYPE = ? 
        AND n.RN_ID = ?  
        AND s.P_ID = ? 
        AND s.C_ID = ?
FOR UPDATE

如果只更新一个表,可以尝试使用子选择而不是联接。比方说,如果将表_A作为更新的目标,这可能会起作用:

SELECT s.ID FROM DATA.TABLE_A s 
WHERE s.ID IN (
  SELECT n.ID
  FROM DATA.TABLE_B n   
    WHERE n.N_ID = ? 
        AND n.N_TYPE = ? 
        AND n.PN_ID = ? 
        AND n.PN_TYPE = ? 
        AND n.RN_ID = ? 
) 
AND s.P_ID = ? 
AND s.C_ID = ?
FOR UPDATE

您是否尝试过以下方法,在select语句中使用RS Read Stability指定:

SELECT ....(
............
) FOR UPDATE WITH RS USE AND KEEP UPDATE LOCKS

这起作用了,但我还是遇到了僵局。选择更新是否可以使用U形锁访问行?否则我需要一个独占锁,对吗?一般来说,这是不可能回答的,因为锁模式取决于DB2版本和平台、选择的访问计划和事务隔离级别——所有这些问题都没有提到。在大多数情况下,死锁表示有缺陷或不适当的应用程序逻辑,因此很少可以通过调整SQL语句来修复。查询现在可以工作了,但是当一次执行100次select->update序列时,仍然会出现死锁。我真的需要这里的专用锁吗?