RE: Revisited: Transactions, insert unique.

Поиск
Список
Период
Сортировка
От Joachim Achtzehnter
Тема RE: Revisited: Transactions, insert unique.
Дата
Msg-id Pine.LNX.4.21.0004252351080.446-100000@wizard.kraut.bc.ca
обсуждение исходный текст
Ответ на RE: Revisited: Transactions, insert unique.  ("Hiroshi Inoue" <Inoue@tpf.co.jp>)
Ответы RE: Revisited: Transactions, insert unique.  ("Hiroshi Inoue" <Inoue@tpf.co.jp>)
Список pgsql-general
In a message to pgsql-general, Hiroshi Inoue wrote:
>
> Strictly speaking SERIALIZABLE isolation level of PosgreSQL isn't
> SERIALIZABLE.

Thanks for clarifying this.

> It's same as Oracle.

So, even the latest versions of Oracle still have this problem?

> AFAIK,there's no way to block (logically) non-existent row(key) except
> unique constraint.

A couple of comments:

There is, of course, a way to achieve this with a concurrancy mechanism
that is based on locking, rather than a multi-version system. Locking
systems in serializable mode would use shared locks for reads and hold the
locks until the end of the transaction. The trick with the non-existent
rows is that the locks must be placed on the access path rather than just
individual rows.

For example, if the select query is executed using a hash index, it would
place a shared lock on the hash bucket where the non-existing row would
have been. If the second transaction does its select before the first one
upgrades its lock to exclusive mode the two transactions will deadlock,
otherwise the second transaction's select blocks. Either way, the problem
is avoided.

Clearly, if a table has no index the lock would have to be placed on the
table because the access method is a full table scan.

The 1,000,000 dollar question is whether there is some way to achieve the
same with a multi version concurrancy system without giving up its
advantages?

My second comment is about the remark "except unique constraint": It is
true that a unique constraint would have stopped the incorrect second
insert in the example under discussion. Furthermore, a unique constraint
or primary key is definitely the way to go in such a case because
performance would be really bad with large tables. However, a unique
constraint does not prevent all serialization violations caused by
non-existent row effects.

> P.S. Note that the default isolation level of PostgreSQL is READ
> COMMITTED.

I see. This is another important point to keep in mind. Thanks for
pointing this out (another minor SQL92 non-compliance :-)

Joachim

--
private:  joachim@kraut.bc.ca    (http://www.kraut.bc.ca)
work:     joachim@mercury.bc.ca  (http://www.mercury.bc.ca)


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

Предыдущее
От: "Hiroshi Inoue"
Дата:
Сообщение: RE: Revisited: Transactions, insert unique.
Следующее
От: "Hiroshi Inoue"
Дата:
Сообщение: RE: Revisited: Transactions, insert unique.