DB2 SELECT FOR UPDATE with internal JOIN
我正试图解决一个DB2问题。我根据以前的Select进行更新,当两个事务并行运行Select时,偶尔会遇到死锁,并且之后都无法更新 所以我试图用selectforupdate来解决这个问题,但是很明显,selectforupdate不适用于内部连接,对吗?有办法解决吗 这是我的选择声明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 = ?
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序列时,仍然会出现死锁。我真的需要这里的专用锁吗?