serialization errors

Поиск
Список
Период
Сортировка
От Ryan VanderBijl
Тема serialization errors
Дата
Msg-id 20030128160837.GA29718@vanderbijlfamily.com
обсуждение исходный текст
Ответы Re: serialization errors  (Stephan Szabo <sszabo@megazone23.bigpanda.com>)
Re: serialization errors  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-general
Hello,

Let us suppose I have a table like this:
    create sequence seq_foo;
    create table foo (
        bar  int primary key default nextval('seq_foo'),
        name varchar(32),
        unique(name)
    );

I need to have multiple clients update this table concurrently.

Below are two "scripts", one for client A, one for client B:

Time:  Client A
1.     BEGIN;
2.     SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
3.     SELECT * FROM foo;  -- each get their own db 'copy'/version
4.     INSERT INTO foo(name) VALUES('test');
5.     [no-op]
6.     COMMIT;
7.     [no-op]

Time:  Client B
1.     BEGIN;
2.     SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
3.     SELECT * FROM foo;  -- each get their own db 'copy'/version
4.     [no-op]
5.     INSERT INTO foo(name) VALUES('test');
6.     [paused waitting for insert to complete]
7.     ERROR:  Cannot insert a duplicate key into unique index foo_name_key

The documentation about concurrency control / serializable isolation level
indicates that if there is a concurrent conflicting update, then I would
receive the following error:
    ERROR:  Can't serialize access due to concurrent update
( The documentation is found here:
    http://www.ca.postgresql.org/users-lounge/docs/7.3/postgres/mvcc.html )

However, as the scripts above demonstrate, one can receive other errors.

So, assuming I mis-understand the documentation, and that mutliple errors can
legally occur, how can I detect if an error received is because of a concurrent
update?

There are many reasons that the INSERT statement could fail (e.g. syntax,
database connection dropped, conflicting concurrent update, unique constraint).

In serialiable mode, I am supposed to put the database update code inside of
a loop.  There are two break conditions for this loop:
   the update code succeeded  or
   a database error not caused by a concurrent update occurred

When the error is 'Can't serialize' it is trivial to know to retry the loop.

If I receive the legal error "duplicate key" error, how am I supposed to
detect if that error is due to a concurrent update, or because of some
other error elsewhere?

If I receive a different error, how can I tell if I should retry or
pass the error onto the user?

Thanks for any help!

Ryan
--
Ryan VanderBijl                              rvbijl@vanderbijlfamily.com

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

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: ERROR: syscache lookup for index 245488730 failed
Следующее
От: Tom Lane
Дата:
Сообщение: Re: alter database/user set problem