If your two hard disks are on different interfaces and controlled by different drivers, Linux will name them in the order in which the drivers are initialized. If the initializations are in parallel, this can indeed cause the device name assignments to vary.
Device names are assigned by udev. Your problem is mentioned in the Arch wiki, but there doesn't seem to be a solution there.
I'm not familiar with Arch, so I'll explain how this problem is solved in Ubuntu; the underlying features are provided by the Linux kernel, which is the same, but there might be configuration settings that make these features work differently on Arch.
Rather than use /dev/sda2 as the root device (the root=) setting in the bootloader, you can use a UUID or a label, with the following syntax:
… /boot/vmlinuz root=UUID=01234567-89ab-cdef-0123-456789abcdef ro …
… /boot/vmlinuz root=LABEL=mylabel ro …
The UUID identifies a filesystem uniquely, so you want the UUID of the filesystem that's on /dev/sda2. On Ubuntu, /dev/disk/by-uuid/01234567-89ab-cdef-0123-456789abcdef is a symbolic link to /dev/sda2. If your filesystem has a label (set manually, it's up to you to enforce uniqueness), there's a symbolic link under /dev/disk/by-label. The labels and UUID links are generated by the following udev rules:
ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{ID_FS_UUID_ENC}=="?*", SYMLINK+="disk/by-uuid/$env{ID_FS_UUID_ENC}"
ENV{ID_FS_USAGE}=="filesystem|other", ENV{ID_FS_LABEL_ENC}=="?*", SYMLINK+="disk/by-label/$env{ID_FS_LABEL_ENC}"