I don't know if this helps much, but one common cause of database locks is unindexed foreign keys. If you are deleting from the parent table or the referenced field is getting updated frequently, the whole child table gets locked each and every time. So, it's a good idea to have indexes on foreign keys.
However, you have to keep Tom Kyte's pointers on when NOT to use them:
* You do not delete from the parent table.
* You do not update the parent table's unique/primary key value, either purposely or by accident(via a tool).
* You do not join from the parent table to the child table, or more generally - the foreign key columns do not support an important access path to the child table.
Regards,
Vamsee.