It is unlikely you really need to reboot before upgrading. Windows installer will handle locked files.
Your custom actions should be conditioned depending on whether a particular component is being installed or removed and should probably do nothing if the related component is already installed and is not being upgraded. Unfortuately there is a tendancy among beginners to condition on features or even worse (and disasterously wrong) REMOVE="ALL". If you have componetised and conditioned your product properly upgrades are really effective.
The upgrade can work by simple overwriting components with older key files (minor upgrade - reinstallation). Or by "Major" upgrades which is a more controlled way of doing things. In a major upgrade at some point the new installation exectutes an action called RemoveExistingProducts. This exectues the msi database of the previous installation to remove itself.
There are two points where the RemoveExistingProducts action is commonly placed. The first is before InstallInitialize. This results in the old installation being completely removed before the new installation is installed. If this forces a reboot the install should resume and install the new installation.
The second location is in my opinion the better choice. RemoveExistingProducts is placed immediately after InstallFinalize. In this case the install will install only components with newer key files. (The installer will record that these components are used by the new product. in the registry). Now when RemoveExistingProducts calls the old install. The old install does not remove the components that were referenced by the new install and just removes components that are completely obsolete.
Now, for example. if all your upgrade is doing is changing the user interface of your installation you do not need to reboot as the awkward component is staying the same.
I can not say if you really need to reboot half way through an upgrade but you can work around a lot of cases. For instance one of my installations has a kernel mode driver that can not be stopped. So at first sight I need to reboot before this driver is to be upgraded. But in practice I have just overwrite the old component and let a reboot at the end take care of reinitialisation.
(Edited by Ian Blake at 9:41 pm on Sep. 25, 2001)