Return-Path: Delivered-To: apmail-db-derby-dev-archive@www.apache.org Received: (qmail 90953 invoked from network); 16 Jun 2010 13:40:51 -0000 Received: from unknown (HELO mail.apache.org) (140.211.11.3) by 140.211.11.9 with SMTP; 16 Jun 2010 13:40:51 -0000 Received: (qmail 57818 invoked by uid 500); 16 Jun 2010 13:40:51 -0000 Delivered-To: apmail-db-derby-dev-archive@db.apache.org Received: (qmail 57767 invoked by uid 500); 16 Jun 2010 13:40:49 -0000 Mailing-List: contact derby-dev-help@db.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: Delivered-To: mailing list derby-dev@db.apache.org Received: (qmail 57482 invoked by uid 99); 16 Jun 2010 13:40:49 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 16 Jun 2010 13:40:48 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.22] (HELO thor.apache.org) (140.211.11.22) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 16 Jun 2010 13:40:46 +0000 Received: from thor (localhost [127.0.0.1]) by thor.apache.org (8.13.8+Sun/8.13.8) with ESMTP id o5GDeOuP024224 for ; Wed, 16 Jun 2010 13:40:25 GMT Message-ID: <28948657.29561276695624807.JavaMail.jira@thor> Date: Wed, 16 Jun 2010 09:40:24 -0400 (EDT) From: "Brett Wooldridge (JIRA)" To: derby-dev@db.apache.org Subject: [jira] Commented: (DERBY-4279) Statement cache deadlock In-Reply-To: <1442061145.1245454207724.JavaMail.jira@brutus> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-JIRA-FingerPrint: 30527f35849b9dde25b450d4833f0394 X-Virus-Checked: Checked by ClamAV on apache.org [ https://issues.apache.org/jira/browse/DERBY-4279?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12879337#action_12879337 ] Brett Wooldridge commented on DERBY-4279: ----------------------------------------- The original still had a synchronized block that synchronized on the prepared statement. Was it unnecessary? I'm not so sure... One concern is the statement above "GenericActivationHolder instances are private to a transaction". Private to a transaction, and private to a thread are two different things. We run in an XA environment, and theoretically (as far as I understand XA), a transaction can span both connections and threads. Another issue, is that, when running with the above patch I am seeing intermittent failures in our server application. There are multiple threads doing "DELETE FROM" and "INSERT INTO" the same table, and I am seeing an occasional insert failure stating that the insert would cause a primary key violation. At this point, I am not sure it is related to the patch or not because our server code has been shifting about as well. However, a short run using 10.6.1.0 without the patch did not see this particular error. Because the issue is intermittent, and I unsure whether the cause is the patch or application level code. Further testing tomorrow should clarify. Note that running the derby test suite did not result in any errors. > Statement cache deadlock > ------------------------ > > Key: DERBY-4279 > URL: https://issues.apache.org/jira/browse/DERBY-4279 > Project: Derby > Issue Type: Bug > Components: SQL > Affects Versions: 10.0.2.1, 10.1.3.1, 10.2.2.0, 10.3.3.0, 10.4.2.0, 10.5.1.1 > Environment: Windows Vista > Reporter: Jeff Stuckman > Assignee: Brett Wooldridge > Attachments: Derby4279.java, patch4279.txt, stacktrace.txt > > > Due to a design flaw in the statement cache, a deadlock can occur if a prepared statement becomes out-of-date. > I will illustrate this with the following example: > The application is using the embedded Derby driver. The application has two threads, and each thread uses its own connection. > There is a table named MYTABLE with column MYCOLUMN. > 1. A thread prepares and executes the query SELECT MYCOLUMN FROM MYTABLE. The prepared statement is stored in the statement cache (see org.apache.derby.impl.sql.GenericStatement for this logic) > 2. After some time, the prepared statement becomes invalid or out-of-date for some reason (see org.apache.derby.impl.sql.GenericPreparedStatement) > 3. Thread 1 begins a transaction and executes LOCK TABLE MYTABLE IN EXCLUSIVE MODE > 4. Thread 2 begins a transaction and executes SELECT MYCOLUMN FROM MYTABLE. The statement is in the statement cache but it is out-of-date. The thread begins to recompile the statement. To compile the statement, the thread needs a shared lock on MYTABLE. Thread 1 already has an exclusive lock on MYTABLE. Thread 2 waits. > 5. Thread 1 executes SELECT MYCOLUMN FROM MYTABLE. The statement is in the statement cache but it is being compiled. Thread 1 waits on the statement's monitor. > 6. We have a deadlock. Derby eventually detects a lock timeout, but the error message is not descriptive. The stacks at the time of the deadlock are: > This deadlock is unique because it can still occur in a properly designed database. You are only safe if all of your transactions are very simple and cannot be interleaved in a sequence that causes the deadlock, or if your particular statements do not require a table lock to compile. (For the sake of simplicity, I used LOCK TABLE in my example, but any UPDATE statement would fit.) -- This message is automatically generated by JIRA. - You can reply to this email to add a comment to the issue online.