Gah, hit wrong key combination and the email sent early.

Anyway, after that 'sleep' mess at the bottom is:
T1 or T2: Sleeping too long -- lets run deadlock detection code
T1 or T2: Kill off random participant of deadlock.

The other participant is then allowed to continue their work.

On Sat, 2003-03-01 at 02:03, Rod Taylor wrote:
> On Sat, 2003-03-01 at 00:44, Stephan Szabo wrote:
> > On 1 Mar 2003, Rod Taylor wrote:
> > 
> > > I'm not sure I understand the question. The case as described simply has
> > > to deadlock because your approaching the same values with conflicting
> > > tasks from opposite directions.
> > 
> > Well, the problem is that two cases (one of which I think deadlock is
> > unnecessary in) are very similar.
> 
> I see.  Now I see what your asking about.
> 
> > As I see it:
> > 
> > T1: insert 2
> > T2: delete 2
> > T1: insert 2/update 2 (non-key fields)
> >  shouldn't need to deadlock.
> 
> > T1: insert 2
> > T2: delete 2 & 3
> >    * delete 2's check blocks before
> >       checking 3
> > T1: insert 3
> >  should not need to deadlock I think
> 
> > T1: insert 2
> > T2: delete 3
> > T2: delete 2
> >  (or delete 2 & 3 where 3's check goes then 2's check blocks)
> > T1: insert 3
> >  does need to deadlock
> > 
> > In the second case, both deletes have happened so the row the insert wants
> > to check against is marked for deletion, but since it's going to be
> > checking for the 3 row in the future, and will error if T1 commits, I
> > think it's safe for it to go through.
> > 
> > I'm trying to find a way to differentiate the second and third case given
> > that I'm running inside a constraint check on insert 3. It'd be easy if
> > transaction 1 could see that it's going to be checking for the 3 row
> > later, but I think that'd involve keeping around alot of information about
> > the rows that are affected in some shared way which could get really
> > large.
> 
> Isn't the differentiation going to happen automatically?
> 
> In case 2:
> 
> T1: create fk tuple (uncommitted) -> value 2
> T2: delete pk tuple value 2
> T2:   scan through fk table, find uncommitted tuple value 2 ... sleep
> T2:   scan through fk table, find uncommitted tuple value 2 ... sleep
> T2:   scan through fk table, find uncommitted tuple value 2 ... sleep
> T1: create fk tuple (uncommitted) -> value 3
> T1: commit
> T2:   scan through fk table, find tuple value 2 ... its committed
> T2: <run cascade procedure on tuples found in fk table for value 2>
> T2: continue scan through fk table, find tuple value 3 ... its committed
> T2: <run cascade procedure on tuples found in fk table for value 3>
> T2: All is well -- return control to user.
> 
> In case 3:
> T1: create fk tuple (uncommitted) -> value 2
> T2: delete pk tuple value 3
> T2:   scan through fk table, value 3 not found
> T2: delete pk tuple value 2
> T2:   scan through fk table, find uncommitted tuple value 2 ... sleep
> T2:   scan through fk table, find uncommitted tuple value 2 ... sleep
> T2:   scan through fk table, find uncommitted tuple value 2 ... sleep
> T1: create fk value 3
> T1:   scan through pk table, find uncommitted tuple value 3 ... sleep
> T2:   scan through fk table, find uncommitted tuple value 2 ... sleep
> T1:   scan through pk table, find uncommitted tuple value 3 ... sleep
> T2:   scan through fk table, find uncommitted tuple value 2 ... sleep
-- 
Rod Taylor <[EMAIL PROTECTED]>

PGP Key: http://www.rbt.ca/rbtpub.asc

Attachment: signature.asc
Description: This is a digitally signed message part

Reply via email to