I have the schema described in the test script located here: http://pastebin.com/qeB0vKVV
If you run the script, you can see that there is a ConcurrentModificationError: when I go to delete the contest. If I delete the contestants first, there is no problem. The problem seems to be caused by the double link between "Contest" and "Contestant". The first, an indirect link via TeamContestant through polymorphic inheritance created by the m1 mapper, and the second a backref created by the m2 mapper. If I leave the Contest.team_contestant relation off, the script executes successfully. Removing that relation changes the order of the operations: when it works successfully, all Slot updates happen before the first delete operation. When it fails, the contestants are deleted before the slots are updated as follows: Echo output of a successful run: 2010-12-18 21:37:56,788 INFO sqlalchemy.engine.base.Engine.0x...2890 UPDATE slot SET contest_id=? WHERE slot.id = ? 2010-12-18 21:37:56,788 INFO sqlalchemy.engine.base.Engine.0x...2890 (None, 1) 2010-12-18 21:37:56,788 INFO sqlalchemy.engine.base.Engine.0x...2890 UPDATE slot SET contestant_id=? WHERE slot.id = ? 2010-12-18 21:37:56,788 INFO sqlalchemy.engine.base.Engine.0x...2890 (None, 2) 2010-12-18 21:37:56,789 INFO sqlalchemy.engine.base.Engine.0x...2890 UPDATE slot SET contestant_id=? WHERE slot.id = ? 2010-12-18 21:37:56,789 INFO sqlalchemy.engine.base.Engine.0x...2890 (None, 3) 2010-12-18 21:37:56,789 INFO sqlalchemy.engine.base.Engine.0x...2890 DELETE FROM team_contestant WHERE team_contestant.id = ? 2010-12-18 21:37:56,789 INFO sqlalchemy.engine.base.Engine.0x...2890 ((1,), (2,)) 2010-12-18 21:37:56,790 INFO sqlalchemy.engine.base.Engine.0x...2890 DELETE FROM contestant WHERE contestant.id = ? 2010-12-18 21:37:56,790 INFO sqlalchemy.engine.base.Engine.0x...2890 ((1,), (2,)) 2010-12-18 21:37:56,790 INFO sqlalchemy.engine.base.Engine.0x...2890 DELETE FROM contest WHERE contest.id = ? 2010-12-18 21:37:56,790 INFO sqlalchemy.engine.base.Engine.0x...2890 (1,) Echo from an unsuccessful run: 2010-12-18 17:25:59,017 INFO sqlalchemy.engine.base.Engine.0x...2490 DELETE FROM contestants WHERE contestants.contest_id = %(contest_id)s 2010-12-18 17:25:59,017 INFO sqlalchemy.engine.base.Engine.0x...2490 ({'contest_id': 267}, {'contest_id': 267}) 2010-12-18 17:25:59,025 INFO sqlalchemy.engine.base.Engine.0x...2490 UPDATE slots SET contest_id=%(contest_id)s WHERE slots.id = %(slot_id)s 2010-12-18 17:25:59,025 INFO sqlalchemy.engine.base.Engine.0x...2490 {'contest_id': None, 'slot_id': 4} 2010-12-18 17:25:59,026 INFO sqlalchemy.engine.base.Engine.0x...2490 UPDATE slots SET contestant_id=%(contestant_id)s WHERE slots.id = %(slot_id)s 2010-12-18 17:25:59,027 INFO sqlalchemy.engine.base.Engine.0x...2490 {'contestant_id': None, 'slot_id': 8} 2010-12-18 17:25:59,027 INFO sqlalchemy.engine.base.Engine.0x...2490 UPDATE slots SET contestant_id=%(contestant_id)s WHERE slots.slot_id = %(slot_id)s 2010-12-18 17:25:59,027 INFO sqlalchemy.engine.base.Engine.0x...2490 {'contestant_id': None, 'slot_id': 9} I would expect the Contest.team_contestants relation, since it contains no explicit cascade, to not take precedence over the more inclusive Contest.contestants. It looks like however that the rowcount calculation takes one relation, while the delete takes the other. Is there a bug there? I can actually use viewonly on the team_contestants relation. This seems to cause the correct behavior to occur. Luckily I'm not writing to the team_contestant relation, so I don't think this will adversely affect my application. -- You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalch...@googlegroups.com. To unsubscribe from this group, send email to sqlalchemy+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en.