[ http://issues.apache.org/jira/browse/DERBY-1799?page=all ]
Fernanda Pizzorno updated DERBY-1799: ------------------------------------- Attachment: derby-1799.diff derby-1799.stat The attached patch (derby-1799.diff) implements a similar mechanism for BTreeScan to the positionAtRowLocation mechanism for HeapScan. As the ScrollInsensitiveResultSet is populated, the positionKey(key + rowLocation) of each row is stored in the HashTable. This positionKey is used when scrolling back to a provious visited row in order to position the BTreeScan, and set locks on the row if necessary. The following changes where made to the ScanController interface: * the method positionAtRowLocation(RowLocation) was changed to positionAtRow(DataValueDescriptor[]) so that it can be implemented both by HeapScan and BTreeScan. * a new method getScanPosition was added. This method is also implemented both for HeapScan abd BTreeScan. It returns an array of type DataValueDescriptior. This array has size 1 for HeapScan and contains the RowLocation, and contains the positionKey (key + RowLocation) for BTreeScan. The following changes where made to NoPutResultSet interface: * the method positionScanAtRowLocation(RowLocation) was changed to positionScanAtRow(DataValueDescriptor[]) so that it can be used both for RowLocation and positionKey. * a new method getScanPosition() was added. It returns an array of type DataValueDescriptior, and therefore can return either a RowLocation or positionKey depending on whether a HeapScan or BTreeScan is being used. A new test case was added to ConcurrencyTest. Derbyall is being run with this patch at the moment, and is has successfully run this patch + the patch for DERBY-1676. Can someone please review this patch? > SUR: current row not locked when renavigating to it, in queries with indexes > ---------------------------------------------------------------------------- > > Key: DERBY-1799 > URL: http://issues.apache.org/jira/browse/DERBY-1799 > Project: Derby > Issue Type: Bug > Components: SQL, Store > Affects Versions: 10.2.1.0, 10.2.2.0, 10.3.0.0 > Reporter: Andreas Korneliussen > Assigned To: Fernanda Pizzorno > Attachments: derby-1799.diff, derby-1799.stat > > > This problem is detected in transactions with isolation level > read-committed/read-uncommitted. > We have a table (T) which has a primary key (a), and a query which does > "select A from T" (an indexed select) > If the result set is scrollable updatable, we expect the current row to be > locked with an update lock. This does not seem to happen when repositioning > to a row which has been already been fetched previously. > The result is that either the wrong row is locked, or if the result set has > been on after last position, no row is locked. > Output from ij: > ij> get scroll insensitive cursor c1 as 'select a from t for update'; > ij> next c1; > A > ----------- > 1 > ij> select * from SYSCS_DIAG.LOCK_TABLE; > XID |TYPE |MODE|TABLENAME > > |LOCKNAME |STATE|TABLETYPE|LOCK&|INDEXNAME > > > --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- > 243 |ROW |U |T > > |(1,7) |GRANT|T |1 |NULL > > > 243 |ROW |S |T > > |(1,1) |GRANT|T |1 |SQL060901103455010 > > > 243 |TABLE|IX |T > > |Tablelock |GRANT|T |4 |NULL > > > 3 rows selected > ij> after last c1; > No current row > ij> previous c1; > A > ----------- > 3 > ij> select * from SYSCS_DIAG.LOCK_TABLE; > XID |TYPE |MODE|TABLENAME > > |LOCKNAME |STATE|TABLETYPE|LOCK&|INDEXNAME > > > --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- > 243 |TABLE|IX |T > > |Tablelock |GRANT|T |4 |NULL > > > 1 row selected > The last select shows that no row is locked at this point, however we expect > one row to be locked. -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira