db-derby-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Knut Anders Hatlen (JIRA)" <j...@apache.org>
Subject [jira] Created: (DERBY-4437) Concurrent inserts into table with identity column perform poorly
Date Fri, 06 Nov 2009 10:55:32 GMT
Concurrent inserts into table with identity column perform poorly

                 Key: DERBY-4437
                 URL: https://issues.apache.org/jira/browse/DERBY-4437
             Project: Derby
          Issue Type: Improvement
          Components: SQL
    Affects Versions:
            Reporter: Knut Anders Hatlen

I have a multi-threaded application which is very insert-intensive. I've noticed that it sometimes
can come into a state where it slows down considerably and basically becomes single-threaded.
This is especially harmful on modern multi-core machines since most of the available resources
are left idle.

The problematic tables contain identity columns, and here's my understanding of what happens:

1) Identity columns are generated from a counter that's stored in a row in SYS.SYSCOLUMNS.
During normal operation, the counter is maintained in a nested transaction within the transaction
that performs the insert. This allows the nested transaction to commit the changes to SYS.SYSCOLUMN
separately from the main transaction, and the exclusive lock that it needs to obtain on the
row holding the counter, can be releases after a relatively short time. Concurrent transactions
can therefore insert into the same table at the same time, without needing to wait for the
others to commit or abort.

2) However, if the nested transaction cannot lock the row in SYS.SYSCOLUMNS immediately, it
will give up and retry the operation in the main transaction. This prevents self-deadlocks
in the case where the main transaction already owns a lock on SYS.SYSCOLUMNS. Unfortunately,
this also increases the time the row is locked, since the exclusive lock cannot be released
until the main transaction commits. So as soon as there is one lock collision, the waiting
transaction changes to a locking mode that increases the chances of others having to wait,
which seems to result in all insert threads having to obtain the SYSCOLUMNS locks in the main
transaction. The end result is that only one of the insert threads can execute at any given
time as long as the application is in this state.

This message is automatically generated by JIRA.
You can reply to this email to add a comment to the issue online.

View raw message