使用INNER JOIN进行DB2 SELECT FOR UPDATE

时间:2017-03-30 14:14:55

标签: select db2 sql-update deadlock

我正在尝试解决DB2问题。当两个事务并行运行select时,我根据之前的Select进行更新并偶尔遇到Deadlocks,之后没有一个能够更新。

所以我试图使用Select For Update来解决这个问题,但显然,Select For Update不适用于内连接,这是正确的吗?它有办法吗?

这是我的Select Statement

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

2 个答案:

答案 0 :(得分:1)

如果您只更新一个表,则可以尝试使用子选择而不是连接。比如说,如果您将TABLE_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

答案 1 :(得分:1)

您是否尝试过以下操作,表示在您的select语句中指定WITH RS(读稳定性):

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