Re: atomic multi-threaded upsert
От | KM |
---|---|
Тема | Re: atomic multi-threaded upsert |
Дата | |
Msg-id | 4cedc5f0$0$22107$742ec2ed@news.sonic.net обсуждение исходный текст |
Ответ на | atomic multi-threaded upsert ("Mikhail V. Puzanov" <misha.puzanov@gmail.com>) |
Ответы |
Re: atomic multi-threaded upsert
|
Список | pgsql-sql |
On 2010-11-24, "Mikhail V. Puzanov" <misha.puzanov@gmail.com> wrote: > Next, I execute the following two queries for that table: > > -- increment and get the counter if exists > UPDATE sequences SET counter = counter + 1 > WHERE section = 'testSection' AND name = 'testKey' > RETURNING counter; > > -- insert new counter if not exists > INSERT INTO sequences ( section, name, counter ) > SELECT 'testSection', 'testKey', 0 > WHERE NOT EXISTS ( > SELECT * FROM sequences > WHERE section = 'testSection' AND name = 'testKey' > ); > ERROR: duplicate key value violates unique constraint "idx_sequences_sn" > > 1) That looks weird actually, should the INSERT ... NOT EXISTS (...) be > executed > in atomic fashion? Also, AFAIK, UNIQUE INDEX locks rows before > insert (or not?). > Can it be related to JDBC? > Or it's the result of MVCC conflict resolution? Perhaps - Thread A UPDATEs, affecting no row. Thread B UPDATEs, affecting no row. Thread A INSERTs one row. Autocommit is on, so it commits the INSERT. Thread B attempts INSERT and fails on the duplicate. -- KM
В списке pgsql-sql по дате отправления: