Mikheev, Vadim wrote:
> Try this for both FK tables:
>
> create table tmp2(idx2 int4, col2 int4, constraint
> tmpcon2 foreign key(col2) references tmp1(idx) INITIALLY DEFERRED);
>
> This will defer constraint checks till transaction commit...
> though constraint triggers should use SnapshotDirty instead of
> SELECT FOR UPDATE anyway.
>
> Did you consider this, Jan?
>
> Vadim

    Whenever the checks are done, the transaction inserting a new
    reference to the key must ensure that  this  key  cannot  get
    deleted until it is done and it's newly inserted reference is
    visible  to  others.    Otherwise   a   referential   action,
    preventing referenced key deletion (or other action) wouldn't
    see those and it would be possible to violate the constraint.

    I  don't  see  any  other way doing it than obtaining a lock.
    Using SnapshotDirty would mean, that  one  transaction  could
    DELETE  a  reference,  then  another  transaction removes the
    primary key  (because  using  Dirty  the  DELETE  is  already
    visible),  but  now the first transaction rolls back.  Voila,
    constraint violated.


Jan

--

#======================================================================#
# It's easier to get forgiveness for being wrong than for being right. #
# Let's break this rule - forgive me.                                  #
#================================================== [EMAIL PROTECTED] #


Reply via email to