Re: Possible transaction bug with isolation level serialisable?
От | Heikki Linnakangas |
---|---|
Тема | Re: Possible transaction bug with isolation level serialisable? |
Дата | |
Msg-id | 5358FAE9.7040805@vmware.com обсуждение исходный текст |
Ответ на | Possible transaction bug with isolation level serialisable? (Claudio Nieder <claudio.nieder.lists@inodes.ch>) |
Список | pgsql-bugs |
On 04/24/2014 12:54 PM, Claudio Nieder wrote: > Two concurrent transaction first check if a certain value is listed > in a table and if not try to insert it. As the value inserted hasto > be unique and both try to enter the same one, one transaction fails > reporting that the value is already part of the table. As both are > executed within a transaction with isolation level SERIALIZABLE I > would have expected that one of them would return with a > serialization failure, which my program would have been ready to > handle and re-execute the transaction. If I understood correctly, you're getting a "duplicate key value violates unique constraint" error, but you were expecting to get a "serialization failure" error instead, because you're using SERIALIZABLE isolation level. > The reason I think something is fishy is, because I find the > behaviour is somehow similar to a nonrepeatable read which should not > occur with this transaction level. The > > SELECT "userRef" FROM "VerifyQueue" WHERE lower("email")=lower($1) > > reports, that the value is NOT in the table, thus the program then > tries to insert it, and at that point the value is shown as being in > the table. > > So is this a bug, or did I misunderstand something? It's not a bug. Serializable isolation level guarantees that the COMMIT fails (or some earlier statement) with a serialization error, if serializability would otherwise be violated, but it does not guarantee that you won't hit some other constraint first. In this scenario, I think you would indeed get a serialization failure if there was no unique constraint on the table. (I would not recommend removing the constraint, however!) I think you'll just need to teach your application to also retry duplicate key errors. - Heikki
В списке pgsql-bugs по дате отправления: