Re: JDBC Transactions

Поиск
Список
Период
Сортировка
От Andy Colson
Тема Re: JDBC Transactions
Дата
Msg-id 4CCF2722.1060206@squeakycode.net
обсуждение исходный текст
Ответ на Re: JDBC Transactions  (Jonathan Tripathy <jonnyt@abpni.co.uk>)
Ответы Re: JDBC Transactions  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-general
On 11/1/2010 3:02 PM, Jonathan Tripathy wrote:
>
> On 01/11/10 19:56, Andy Colson wrote:
>> On 11/1/2010 2:29 PM, Jonathan Tripathy wrote:
>>>
>>> On 01/11/10 19:12, Andy Colson wrote:
>>>> On 11/1/2010 2:01 PM, Jonathan Tripathy wrote:
>>>>>
>>>>>>> I'll give you the exact case where I'm worried:
>>>>>>>
>>>>>>> We have a table of customers, and each customer can have multiple
>>>>>>> memberships (which are stored in the memberships table). We want our
>>>>>>> deleteMembership(int membershipID) method to remove the membership,
>>>>>>> then
>>>>>>> check to see if there are no more memberships left for the
>>>>>>> corresponding
>>>>>>> customer, and if there are none, delete the corresponding
>>>>>>> customer as
>>>>>>> well.
>>>>>>>
>>>>>>
>>>>>> Hum.. yeah, I can see a race condition there. but even with table
>>>>>> locking I can see it. Not sure how your stuff works, but I'm thinking
>>>>>> website:
>>>>>>
>>>>>> user1 goes to customer page, clicks on "add membership" and starts
>>>>>> filling out info.
>>>>>>
>>>>>> user2 goes to customer page, clicks on "delete membership" of the
>>>>>> last
>>>>>> member ship, which blows away the membership, then the customer.
>>>>>>
>>>>>> user1 clicks save.
>>>>>>
>>>>>> Wouldnt matter for user2 if you locked the table or not, right?
>>>>>>
>>>>>> -Andy
>>>>>
>>>>> In the case described above, our code would throw an exception saying
>>>>> "Customer no longer exists", prompting the user to create a fresh
>>>>> customer - So I'm not worried about this (Although it may be
>>>>> inconvenient for the user, I don't think much can be done in this
>>>>> case).
>>>>> Please let me know if I've missed something here.
>>>>>
>>>>> I'm more worried about the following situation (Where a bad
>>>>> interleaving
>>>>> sequence happens):
>>>>>
>>>>> user1 goes to customer page, clicks on "delete membership" of the last
>>>>> member ship, which blows away the membership,
>>>>> user2 goes to customer page, clicks on "add membership" and starts
>>>>> filling out info.
>>>>> user1 then blows away the customer.
>>>>>
>>>>> However I guess that if the relations are set up properly in the
>>>>> database, an exception could be thrown to say that there are
>>>>> corresponding memberships still exist...
>>>>>
>>>>
>>>> yep, that sequence could be a problem too. It'll be a problem whenever
>>>> more than one person gets to the customer page. Another user could
>>>> cause that customer to go away at any time. with or without table
>>>> locks:
>>>>
>>>> user1 and 2 go to customer page.
>>>> user1 deletes last membership, and customer
>>>> user2 does anything... cuz customer has gone away.
>>>>
>>>> Do you really need to delete the customer? Is leaving it around a
>>>> problem?
>>>>
>>>> -Andy
>>>>
>>> Yeah, unfortunately leaving the customer round is a problem due to Data
>>> Protection Policies in the EU.
>>>
>>> However, I'm not worried about the above situation, as if the user tries
>>> to do anything with a customer that doesn't exist, an exception is
>>> thrown which is, I believe, handled properly (i.e. the program doesn't
>>> crash, but will simply tell the user to start again and create a new
>>> customer).
>>>
>>> Do you think table relations are enough to solve the situation that I
>>> gave above? I.e:
>>>
>>> user1 goes to customer page, clicks on "delete membership" of the last
>>> membership, which blows away the membership,
>>> user2 goes to customer page, clicks on "add membership" and starts
>>> filling out info.
>>> user1 then blows away the customer.
>>>
>>> Would my above problem be solved if the database refused to remove a
>>> customer if it had remaining memberships?
>>>
>>> Another potential solution could be to leave the customer behind, but
>>> run a script on a Saturday night or something to delete all customers
>>> with no memberships...
>>>
>>> What do you think would be best?
>>>
>>> Thanks
>>>
>>
>> I think we might be splitting hairs... What are the chances two people
>> are editing the same customer at the exact same time? Plus the chances
>> there is only one membership (which one user is deleting), plus the
>> chances they are clicking the save button at the exact same time.
>>
>> In the PG world, I think it might go like:
>>
>> user1 clicks delete last membership:
>> start transaction
>> delete from memberships where id = 42;
>>
>> user2 has filled out new membership and clicks save
>> start transaction
>> insert into memebership where id = 100;
>>
>> user1
>> pg's default transaction level is read commited (which I learned in
>> "[GENERAL] Can Postgres Not Do This Safely ?!?" thread)
>> At this point both have a transaction open, neither commited. If user1
>> checked right now to see if customer had any more memberships, it
>> would not see any and delete the customer which would be bad... but
>> lets wait
>>
>> user2
>> commit
>>
>> user1
>> now user1 would see the new membership, and not delete the customer,
>> which would be ok.
>>
>>
>> So yes, there is a problem. I'm not 100% sure how to solve.
>>
>> -Andy
>>
>
> Sorry, Andy, where is the problem?
>

At this point I'm hoping someone will jump in... hint hint.  I have no
idea if I'm even close to correct.


user1 clicks delete last membership:
 >> start transaction
 >> delete from memberships where id = 42;

user2 has filled out new membership and clicks save
 >> start transaction
 >> insert into memebership where id = 100;

user1
    check to see if any memberships, nope, so blow away the customer
    commit

user2
    commit

now now we have a membership record (100), but no customer record.

-Andy

В списке pgsql-general по дате отправления:

Предыдущее
От: Glenn Maynard
Дата:
Сообщение: FTS phrase searches
Следующее
От: Ray Stell
Дата:
Сообщение: Re: Is this a known feature of 8.1 SSL connection?