On 5 Des, 05:00, t...@xxxxxxxxxxxxx (Tom Lane) wrote: > > Yeah, this is a problem. The SELECT will acquire AccessShareLock > on R and P, and subsequently try to acquire AccessShareLock on all > the inheritance children of P (and I don't think the order in which > these locks are acquired is very clear). Meanwhile the ALTER acquires > AccessExclusiveLock on Pm and R --- probably in that order, though > I'd not really want to promise that ordering either. So the potential > for deadlock is obvious. Indeed. > You seem to be hoping that the SELECT would avoid acquiring lock > on child tables Pn that it didn't need to access, but this cannot be: > it has to get at least AccessShareLock on those tables before it can > even examine their constraints to find out that they don't need to be > scanned. And even if it could magically not take those locks, the > deadlock condition still exists with regard to the child table that > it *does* need to access. Understood. I was really wondering whether the SELECT would be able to acquire locks on child tables at the same time as it acquired the lock on the parent table, but I suppose this isn't an atomic operation: it first has to acquire a lock to be able to see the constraints; then it finds referenced tables and attempts to acquire locks on them. > I guess I'm wondering why you need to be adding foreign key constraints > during live operations. This was just some impatience on my part while updating my database: I was merely inspecting some data which I knew resided in some partitions whilst some other partitions were being altered. Obviously, the database system cannot know that some data of interest isn't going to be found in some partition without checking the properties of that partition. Consequently, it made sense for me to exclude such partitions from consideration by the SELECT in order to help it reach the requested data whilst keeping it out of the way of the alteration activities. I suppose the lingering question is this: what constraints should I drop in order to avoid such problems? Dropping the insert rule from the parent table for each child table being altered *seems* to diminish the possibility of deadlock, in that my tests produced no deadlock situations when I adopted this approach (whereas such situations were unavoidable before adopting this approach), but shouldn't I actually be removing the check constraints from the child tables instead? The manual for 8.1 says that "constraint exclusion is driven only by CHECK constraints", but my intuition tells me that the SELECT should initially be driven by the mere existence of tables inheriting from the parent table and that the insert rules should have little or nothing to do with it. Paul ---------------------------(end of broadcast)--------------------------- TIP 9: In versions below 8.0, the planner will ignore your desire to choose an index scan if your joining column's datatypes do not match