Best practice is to use the default SharePoint locking functionality.
SharePoint does lock forms and it has a 10 minute expiration if the user goes loffline. For example, if users open a form and then go offline, the lock will expire in 10 minutes. So long as they have it open and they have an active session, I believe it won't expire (but, I need to check this again). While they have the lock, other users opening the form, should get Read-Only in the title of the XML form. There are bugs with Vista and Windows 7 accessing SharePoint that you may be seeing but in general, it should work.
To display an alert message, you could add a little logic to the form that checks whether or not it is read-only and pops up a warning. This is probably an hour of time for one of our Qdabra InfoPath developers. You can't do this without writing code today, but you could just tell users to check the title bar of the InfoPath window and if it shows Read-Only, that's their cue not to edit.
Qdabra's Web Service handles document level permissioning (you can specify who has access based on a field in the form) and database locking, but the Web Service doesn't work with Access, just SQL.
You could add a timer to your form to close automatically after 30 minutes or refresh. This would also require some coding since the timer would have to exist in the taskpane in order for it to automatically re-enter the form logic and cause a close or refresh on timeout. This would likely be several hours of development and testing but would depend on your scenario.
Another idea would be to assign the form to the first user who opens the form (assuming they have read-write access) and submit the form back to SharePoint with assignment specified in the form field (a hidden field). This field would be promoted to a column in SharePoint. Then, you can change the default SharePoint view that people see to exclude forms not assigned to them. Search for blogs and posts on the "SharePoint [me] filter". This way you can prevent people from being confused since they will have to go to a separate view (forms in edit process) to open a form that is already open. You can create this separate view that is basically all forms that are currently open and put large red letters at the top of the view telling people that they will only have read access. Just make sure to clear the assignment field when they submit. You can do this all without writing code. Just have an Open Rule that sets the field and submits. Then add a rule to your submit button that clears the field before submitting on close. Of course, you'll have to promote the field and modify the SharePoint views too and that will take some time, but it can all be done without buying anything and without writing any code. This doesn't prevent the Access rows from being written, but so long as there is no other way to update them (except the form), you should be ok.
If you need finer control and want to make this easier to configure (so that every form library doesn't have to be custom configured), I recommend Qdabra's DBXL Web Service but you'll have to change to use SQL (however, free versions of SQL work too).
Hope this helps!