SELECT … FOR UPDATE
Informix®
Legacy BDL programs typically use a cursor with SELECT FOR UPDATE
to implement
pessimistic locking and avoid several users editing the same rows:
DECLARE cc CURSOR FOR
SELECT ... FROM tab WHERE ... FOR UPDATE
OPEN cc
FETCH cc <-- lock is acquired
...
CLOSE cc <-- lock is released
The row must be fetched in order to set the lock.
If the cursor is local to a transaction, the lock is released when the transaction ends. If the
cursor is declared WITH HOLD
, the lock is released when the cursor is closed.
Informix provides the
SET LOCK MODE
instruction to define the lock wait
timeout:SET LOCK MODE TO { WAIT | NOT WAIT | WAIT seconds }
The
default mode is NOT WAIT
.Netezza®
With Netezza, locks are released when closing the cursor or when the transaction ends.
Netezza does not support SELECT FOR
UPDATE
statements: Netezza systems are designed
for data warehouse applications, not for OLTP applications. In a DW context, concurrent data access
is not required or a priority.
Solution
Review the program logic when using SELECT FOR UPDATE
statements.