This is just off the top of my head: Consider using a named lock via dbms_lock.
http://download.oracle.com/docs/cd/B28359_01/appdev.111/b28419/d_lock.htm#CHDICHDC
Right after the begin statement get the lock, do the work, then release it on
exit (Keep errors/exceptions in mind!).
KT