[ 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

        

Reply via email to