Row locks (also referred to as transaction (TX) locks) are generally indicative of poor application design, as they indicate different users contending for the same row of data. If multiple transactions concurrently hold share table locks for the same table, no transaction can update the table (even if row locks are held as the result of a SELECT... FOR UPDATE statement). Therefore, if concurrent share table locks on the same table are common, updates cannot proceed and deadlocks are common.

One more possible reason for row lock waits are INSERT and UPDATE statements on a child table waiting for row locks on the parent table to clear (foreign key).