Return-Path: X-Original-To: apmail-db-derby-dev-archive@www.apache.org Delivered-To: apmail-db-derby-dev-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 9DE3F7971 for ; Wed, 9 Nov 2011 02:34:16 +0000 (UTC) Received: (qmail 84915 invoked by uid 500); 9 Nov 2011 02:34:16 -0000 Delivered-To: apmail-db-derby-dev-archive@db.apache.org Received: (qmail 84876 invoked by uid 500); 9 Nov 2011 02:34:16 -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 84869 invoked by uid 99); 9 Nov 2011 02:34:15 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 09 Nov 2011 02:34:15 +0000 X-ASF-Spam-Status: No, hits=-2001.2 required=5.0 tests=ALL_TRUSTED,RP_MATCHES_RCVD X-Spam-Check-By: apache.org Received: from [140.211.11.116] (HELO hel.zones.apache.org) (140.211.11.116) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 09 Nov 2011 02:34:12 +0000 Received: from hel.zones.apache.org (hel.zones.apache.org [140.211.11.116]) by hel.zones.apache.org (Postfix) with ESMTP id 88ECC3EA96 for ; Wed, 9 Nov 2011 02:33:51 +0000 (UTC) Date: Wed, 9 Nov 2011 02:33:51 +0000 (UTC) From: "Brett Wooldridge (Commented) (JIRA)" To: derby-dev@db.apache.org Message-ID: <698016589.12929.1320806031562.JavaMail.tomcat@hel.zones.apache.org> Subject: [jira] [Commented] (DERBY-4279) Statement cache deadlock 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=13146735#comment-13146735 ] Brett Wooldridge commented on DERBY-4279: ----------------------------------------- It is inappropriate to offer a "bounty" for this bug? I'm willing to pay to have this fixed. The amount of time I've spent trying to workaround this issue is ridiculous, and ultimately all such attempts have ended up distorting the readability of the code. I am actually stunned that more people are not encountering this bug. Basically if two (or more) threads are SELECTing and UPDATEing the same table, they WILL hit this issue under load. > 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, 10.8.1.2 > Environment: Windows Vista, OS X 10.5+ > Reporter: Jeff Stuckman > Labels: derby_triage10_5_2 > Attachments: Derby4279.java, client_stacktrace_activation_closed.txt, 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. If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa For more information on JIRA, see: http://www.atlassian.com/software/jira