On Sun, 10 Jan 2010 16:01:57 +0800, Craig Ringer wrote:

>On 6/01/2010 10:53 PM, John T. Dow wrote:
>> I posted this several days ago to pgsql-jdbc but have had no response. I am 
>> posting it here (with minor changes in the wording).
>>
>> I have developed some code that works, I'm just not sure I have the "best" 
>> solution.
>>
>> I have applications in which the user can create a read-only resultset with 
>> multiple rows. For example, customers who are 90 days in arrears might be 
>> brought up for review.
>>
>> The user might scroll through the rows reviewing the data, and then he might 
>> decide to update one of them. A second query is used to update that one row. 
>> At the time of the update, the current contents of that row is reread FOR 
>> UPDATE and compared against the original row. If they differ, someone else 
>> has altered the row after the resultset was created.
>>
>> The user is informed that another user has changed the row in question; he 
>> can then decide to accept the changes he has made or leave in place the 
>> changes made by the other user. In either case, that row in the original 
>> resultset has to be made to match the current contents in the table, because 
>> the user might scroll back and forth and revisit it.
>>
>> I am using refreshRow() to make that row current, but the problem is that 
>> refreshRow() can be extremely slow.
>>
>> I create the read-only, multiple row resultset (ie "viewResultSet") like 
>> this:
>>
>>      createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, 
>> ResultSet.CONCUR_READ_ONLY);
>>      viewResultSet = jdbcStmt.executeQuery("SELECT ... FROM ... WHERE select 
>> multiple rows");
>>
>>      Scroll through the resultset to view rows as desired.
>>      
>>      When positioned at a row, can update that row. See below.
>
>Can you instead create an explicit, named updatable cursor? Then FETCH 
>from it, and UPDATE ... WHERE CURRENT OF it? That way you won't have to 
>do all this kludging with refreshing rowsets.
>
>--
>Craig Ringer

I have not used cursors, so you've inspired me to rtfm about them. So far I 
don't see how to implement optimistic locking with cursors.

The postgres documentation says this: "Without FOR UPDATE, a subsequent WHERE 
CURRENT OF command will have no effect if the row was changed since the cursor 
was created." 

I read that to mean that the cursor has to be declared FOR UPDATE, which means 
that the rows are locked and I don't have optimistic locking.

John


-- 
Sent via pgsql-general mailing list (pgsql-general@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-general

Reply via email to