| From: | daniel alvarez <d-alvarez(at)gmx(dot)de> |
|---|---|
| To: | pgsql-sql(at)postgresql(dot)org |
| Subject: | Atomicity of UPDATE, interchanging values in unique column |
| Date: | 2003-03-08 21:17:13 |
| Message-ID: | 32207.1047158233@www5.gmx.net |
| Views: | Whole Thread | Raw Message | Download mbox | Resend email |
| Thread: | |
| Lists: | pgsql-sql |
UPDATE statements are not completely atomic in that index entries are
updated
separately for each row. A query interchanging two values within a column
declared
UNIQUE will fail due to the attempt of inserting a duplicate temporarily. It
seems
like Postgres validates constraints on indexes each time the implementation
modifies
the index, rather than on the logical transaction boundaries.
I tried:
UPDATE sometable SET unique_col =
CASE WHEN unique_col = firstvalue THEN secondvalue
ELSE firstvalue
END
WHERE unique_col = firstvalue
OR unique_col = secondvalue
And:
BEGIN;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
UPDATE sometable SET unique_col = firstvalue WHERE unique_col = secondvalue;
UPDATE sometable SET unique_col = secondvalue WHERE unique_col = firstvalue;
COMMIT;
And both queries fail.
Of course I could prevent this by first updating one of the entries with a
dummy value:
BEGIN;
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
UPDATE sometable SET unique_col = dummy WHERE unique_col = secondvalue;
UPDATE sometable SET unique_col = secondvalue WHERE unique_col = firstvalue;
UPDATE sometable SET unique_col = firstvalue WHERE unique_col = dummy;
COMMIT;
But that's more like in a 3GL language and does not cleanly express what I
want.
How can I interchange two values in a unique column? Am I missing something
really
obvious (like a swap statement)? Is there any reason besides performance for
not
making index accesses fully ACID-compliant? Doesn't MVCC require this
anyway?
Thanks for your time, Daniel Alvarez <d-alvarez(at)gmx(dot)de>
--
+++ GMX - Mail, Messaging & more http://www.gmx.net +++
Bitte lächeln! Fotogalerie online mit GMX ohne eigene Homepage!
| From | Date | Subject | |
|---|---|---|---|
| Next Message | Rod Taylor | 2003-03-08 21:33:22 | Re: Atomicity of UPDATE, interchanging values in unique column |
| Previous Message | Chris Gamache | 2003-03-07 22:14:01 | Splitting text into rows with SQL |