Thanks Tom et al, I appreciate the explanation. I am certainly more appreciative of what is going on behind the scenes now when I see 'tuple concurrently updated' errors.
I couldn't initially find a way to grant select on all present *and future*tables in a schema, which is why we took the approach we did. Now I have discovered 'ALTER DEFAULT PRIVILEGES' which will allow me to remove these concurrent permission grants - I only need to exec one ALTER DEFAULT PRIVILEGES command when the schema is created. Much obliged, Jason On Sun, Mar 2, 2014 at 6:09 AM, Tom Lane <t...@sss.pgh.pa.us> wrote: > Adrian Klaver <adrian.kla...@aklaver.com> writes: > > On 02/27/2014 06:54 PM, Jason Daly wrote: > >> When I attempt to execute the non-query "GRANT SELECT ON TABLE > >> <schema>.<table> TO <role>", I occasionally encounter an exception from > >> postgresql, 'tuple concurrently updated'. > > > My guess this is covered here: > > http://rhaas.blogspot.com/2013/07/mvcc-catalog-access.html > > While MVCC catalog scans are a necessary step towards making this kind of > thing safe, they aren't by any means sufficient. It'd be necessary to add > some kind of locking scheme if you want to avoid "tuple concurrently > updated" errors. This is not really any different from the situation > where two transactions both want to update the same row in a user table: > unless the application takes extra steps to serialize the updates, you're > going to get "tuple concurrently updated" errors. > > We do have such locking for DDL on tables/indexes, but the theory in the > past has been that it's not worth the trouble for objects represented by > single catalog rows, such as functions or roles. You can't corrupt the > database with concurrent updates on such a row, you'll just get a "tuple > concurrently updated" error from all but the first-to-arrive update. > So the benefit-to-work ratio hasn't been high enough to motivate anyone > to work on it. Possibly this will change sometime in the future, but > I wouldn't hold my breath waiting. > > In the meantime, you could consider using an application-managed advisory > lock if you really need such grants to work transparently. > > However, might I suggest that you're doing it wrong? If you have enough > traffic on permission grants for a single table that concurrent updates > are a real hazard, it would likely be much better to invent a group role > that holds a relatively static set of rights, and implement the everyday > permissions changes by granting or revoking membership in the group role. > Not only is this using SQL permissions the way they were meant to be used, > but it should remove the concurrent-updates problem, because role > memberships are represented by distinct rows in pg_auth_members. Also, > our implementation isn't terribly efficient for cases where lots and lots > of roles have separate permissions to a single object --- I think the acl > arrays are just searched linearly, and in any case performance would > certainly go south once they got big enough to require toasting. > > regards, tom lane >