Doug> Neither transaction touches FK fields - so shouldn't they both Doug> skip FK trigger check?
The optimization that lets the check be skipped only applies on the _first_ modification of the row within the transaction. On the second or subsequent modifications, the code can't easily tell whether the row was inserted in the current transaction (in which case the optimization must be skipped) or just modified, so it assumes the worst.