2回の取引があります。作成後に投稿にタグを割り当てるもの (トランザクション B)。別のトランザクション (トランザクション A) は、どの投稿でも使用されなくなったタグを削除します。投稿削除後に行っています。
取引A
SELECT COUNT(*) FROM post_tags WHERE tag_id = 45;
取引B
SELECT id FROM tag WHERE name = 'rss';
取引A
DELETE FROM tag WHERE id = 45;
取引B
-- Now, foreign key violation
INSERT INTO post_tags(post_id, tag_id) VALUES(123, 45);
両方のトランザクションで SELECT FOR UPDATE を使用できることはわかっていますが、タグを割り当てるだけのトランザクションをロックしたくありません。タグを削除しようとしているトランザクションがある場合にのみロックしたい。