Re: INSERT...ON DUPLICATE KEY LOCK FOR UPDATE - Mailing list pgsql-hackers
From | Peter Geoghegan |
---|---|
Subject | Re: INSERT...ON DUPLICATE KEY LOCK FOR UPDATE |
Date | |
Msg-id | CAM3SWZSj+JiWnbFEZTHxC0tQO_PP8cvJ4NzTfqb7j2H2p74azg@mail.gmail.com Whole thread Raw |
In response to | Re: INSERT...ON DUPLICATE KEY LOCK FOR UPDATE (Greg Stark <stark@mit.edu>) |
Responses |
Re: INSERT...ON DUPLICATE KEY LOCK FOR UPDATE
Re: INSERT...ON DUPLICATE KEY LOCK FOR UPDATE |
List | pgsql-hackers |
On Sat, Sep 14, 2013 at 1:57 AM, Greg Stark <stark@mit.edu> wrote: > It seems to me that the nature of the problem is that there will unavoidably > be a nexus between the two parts of the code here. We can try to isolate it > as much as possible but we're going to need a bit of a compromise. Exactly. That's why all the proposals with the exception of this one have to date involved unacceptable bloating - that's how they try and span the nexus. I'll find it very difficult to accept any implementation that is going to bloat things even worse than our upsert looping example. The only advantage of such an implementation over the upsert example is that it'll avoid burning through subxacts. The main reason I don't want to take that approach is that I know it won't be accepted, because it's a disaster. That's why the people that proposed this in various forms down through the years haven't gone and implemented it themselves. I do not accept that all of this is like the general situation with row locks. I do not think that the big costs of having many dead duplicates in a unique index can be overlooked (or perhaps the cost of cleaning them up eagerly, which is something I'd also expect to work very badly). That's something that's going to reverberate all over the place. Imagine a simple, innocent looking pattern that resulted in there being unique indexes that became hugely bloated. It's not hard. What I will concede (what I have conceded, actually) is that it would be better if the locks were more granular. Now, I'm not so much concerned about concurrent inserters inserting values that just so happen to be values that were locked. It's more the case that I'm worried about inserters blocking on other values that are incidentally locked despite not already existing, that would go on the locked page or maybe a later page. In particular, I'm concerned about the impact on SERIAL primary key columns. Not exactly an uncommon case (though one I'd already thought to optimize by locking last). What I think might actually work acceptably is if we were to create an SLRU that kept track of value-locks per buffer. The challenge there would be to have regular unique index inserters care about them, while having little to no impact on their regular performance. This might be possible by having them check the buffer for external value locks in the SLRU immediately after exclusive locking the buffer - usually that only has to happen once per index tuple insertion (assuming no duplicates necessitate retry). If they find their value in the SLRU, they do something like unlock and block on the other xact and restart. Now, obviously a lot of the details would have to be worked out, but it seems possible. In order for any of this to really be possible, there'd have to be some concession made to my position, as Greg mentions here. In other words, I'd need buy-in for the general idea of holding locks in shared memory from indexes across heap tuple insertion (subject to a sound deadlock analysis, of course). Some modest compromises may need to be made around interruptibility. I'd also probably need agreement that it's okay that value locks can not last more than an instant (they cannot be held indefinitely pending the end of a transaction). This isn't something that I imagine to be too controversial, because it's true today for a single unique index. As I've already outlined, anyone waiting on another transaction with a would-be duplicate to commit has very few guarantees about the order that it'll get its second shot relative to the order it initial queued up behind the successful but not-yet-committed inserter. -- Peter Geoghegan
pgsql-hackers by date: