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 da...@apache.org on 2014/06/06 00:00:26 UTC
svn commit: r1600779 -
/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/ReferencedKeyRIChecker.java
Author: dag
Date: Thu Jun 5 22:00:26 2014
New Revision: 1600779
URL: http://svn.apache.org/r1600779
Log:
DERBY-6576 A immediate Fk constraint blows up iff its referenced PK is deferred and we modify a duplicate key column
A follow-up patch, derby-6576-repeatable-read. In the case where we do
not throw an exception because the deferred unique/pk constraint
referenced by an fk is upheld by another row, we need to make sure
that condition holds until we commit. This patch changes the check (in
ReferencedKeyRIChecker#isDuplicated) to scan using repeatable read
isolation level instead of read committed. This will set a read lock
on any (well, the first we find) duplicate row till transaction end
and thus ensure things are good till we commit.
Modified:
db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/ReferencedKeyRIChecker.java
Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/ReferencedKeyRIChecker.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/ReferencedKeyRIChecker.java?rev=1600779&r1=1600778&r2=1600779&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/ReferencedKeyRIChecker.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/ReferencedKeyRIChecker.java Thu Jun 5 22:00:26 2014
@@ -340,20 +340,25 @@ public class ReferencedKeyRIChecker exte
0, // read only
TransactionController.MODE_RECORD,
// record locking
- TransactionController.ISOLATION_READ_COMMITTED_NOHOLDLOCK,
+
+ // Use repeatable read here, since we rely on the row being
+ // present till we commit if we accept this row as being
+ // the one the upholds the constraint when we delete ours.
+ TransactionController.ISOLATION_REPEATABLE_READ,
+
(FormatableBitSet)null, // retrieve all fields
- key, // startKeyValue
+ key, // startKeyValue
ScanController.GE, // startSearchOp
null, // qualified
- key, // stopKeyValue
+ key, // stopKeyValue
ScanController.GT); // stopSearchOp
} else {
refKeyIndexScan.reopenScan(
- key, // startKeyValue
- ScanController.GE, // startSearchOp
- null, // qualifier
- key, // stopKeyValue
- ScanController.GT); // stopSearchOp
+ key, // startKeyValue
+ ScanController.GE, // startSearchOp
+ null, // qualifier
+ key, // stopKeyValue
+ ScanController.GT); // stopSearchOp
}