Re: PostgreSQL not ACID compliant?
От | Florian Weimer |
---|---|
Тема | Re: PostgreSQL not ACID compliant? |
Дата | |
Msg-id | 871xubmc8o.fsf@deneb.enyo.de обсуждение исходный текст |
Ответ на | Re: PostgreSQL not ACID compliant? ("scott.marlowe" <scott.marlowe@ihs.com>) |
Ответы |
Re: PostgreSQL not ACID compliant?
|
Список | pgsql-hackers |
"scott.marlowe" <scott.marlowe@ihs.com> writes: > Postgresql supports Serializable transactions, which are 100% ACID > compliant. How can I activate it? 8-) Yes, I know about SET TRANSACTION ISOLATION LEVEL SERIALIZABLE, please read on. Given the two tables: CREATE TABLE items (item INTEGER); CREATE TABLE counts (count INTEGER); And transactions following this pattern: number := <some number>; INSERT INTO items VALUES (number); nr := SELECT COUNT(*) FROM items; INSERT INTO counts VALUES(nr); COMMIT; If these transactions are executed serially, the following condition always holds once the tables are non-empty: (*) (SELECT COUNT(*) FROM items) = (SELECT MAX(count) FROM counts) Now look at the following history: Session 1 Session 2 number := <some number>; number := <some number>; INSERT INTO items VALUES (number); INSERT INTO items VALUES (number); nr := SELECT COUNT(*) FROM items; nr := SELECT COUNT(*) FROM items; INSERT INTO counts VALUES (nr); INSERT INTO counts VALUES (nr); COMMIT; COMMIT; If you enter these commands in two parallel psql sessions, in the order indicated, condition (*) no longer holds once both transactions are completed. Therefore, PostgreSQL must have generated a non-serializable history. Is this a bug, or is SQLxx serializability defined in different terms?
В списке pgsql-hackers по дате отправления: