You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by kr...@apache.org on 2012/07/25 18:37:54 UTC
svn commit: r1365661 -
/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/ResultColumnList.java
Author: kristwaa
Date: Wed Jul 25 16:37:54 2012
New Revision: 1365661
URL: http://svn.apache.org/viewvc?rev=1365661&view=rev
Log:
DERBY-4279: Statement cache deadlock
Modified ResultColumnList.generateHolderMethod to only take a lock when
obtaining row template(s) if the data dictionary is in DDL_MODE. The lock that
used to be obtained was a CIS lock/latch.
The purpose of this change is to avoid the deadlocks that have been observed in
some scenarios when statements are being compiled or recompiled.
Patch contributed by Brett Wooldridge (brett dot wooldridge at gmail dot com).
Patch file: patch4279_2.txt
Modified:
db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/ResultColumnList.java
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/ResultColumnList.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/ResultColumnList.java?rev=1365661&r1=1365660&r2=1365661&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/ResultColumnList.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/compile/ResultColumnList.java Wed Jul 25 16:37:54 2012
@@ -1634,13 +1634,19 @@ public class ResultColumnList extends Qu
int savedItem;
RowLocation rl;
- cc = getLanguageConnectionContext().
- getTransactionCompile().openConglomerate(
- conglomerateId,
- false,
- 0,
- TransactionController.MODE_RECORD,
- TransactionController.ISOLATION_READ_COMMITTED);
+ LanguageConnectionContext lcc = getLanguageConnectionContext();
+ DataDictionary dd = lcc.getDataDictionary();
+
+ int isolationLevel = (dd.getCacheMode() == DataDictionary.DDL_MODE) ?
+ TransactionController.ISOLATION_READ_COMMITTED : TransactionController.ISOLATION_NOLOCK;
+
+ cc = lcc.getTransactionCompile().openConglomerate(
+ conglomerateId,
+ false,
+ 0,
+ TransactionController.MODE_RECORD,
+ isolationLevel);
+
try
{
rl = cc.newRowLocationTemplate();