The situation on linux is actually different because the kernel and glibc are maintained separately and the syscall ABI is treated as a boundary between components.
Any time a new syscall is wrapped the userland maintainers need to account for what happens when run on an old kernel and typically have some fallback logic.
To solve this, the updater could create a new boot environment[0], install everything in that boot environment using as many passes as required, then reboot into that environment. OpenSuse already does a similar thing[1], though I don't know how well it works.
[0] https://www.freebsd.org/cgi/man.cgi?beadm
[1] https://news.opensuse.org/2018/05/15/transactional-updates-i...