Normally we handle that in the database layer, since the individual applications on separate computers aren't directly aware of each other. The apps can check the database themselves prior to performing an operation or on a regular basis, or underlying stored procedures can manage the modality using some kind of simple table and locking for the semaphore.
On a non-distributed web application on a single server, you can handle this fairly easy with the Application object, since there really is one Application and it can monitor user activity fairly easily.
Let's assume you have just two modes and everything is handled in stored procs:
Mode where one user in doing some kind of POSTING operation and NORMAL mode. Let's assume that the operations in the POSTING operation are relatively simple, and for clarity we'll leave out the code which ensures no race conditions, and have all code inline instead of encapsulated into other SPs or functions:
CREATE PROCEDURE Post
AS
BEGIN
UPDATE ModeControl
SET Mode = 'POSTING'
UPDATE Payments
SET Whatever = whatever
WHERE whatever
UPDATE ModeControl
SET Mode = 'NORMAL'
END
CREATE PROCEDURE IsPosting -- poll this in your app or before performing operations
AS
BEGIN
IF EXISTS (SELECT * FROM ModeControl WHERE Model = 'POSTING')
RETURN 1
ELSE
RETURN 0
END
CREATE PROCEDURE Normal1
AS
BEGIN
-- Catches potential problems at database even though app shouldn't call in 'POSTING' more
IF EXISTS (SELECT * FROM ModeControl WHERE Model = 'POSTING')
RAISERROR...
-- Perform Normal1 operations
END
CREATE PROCEDURE Normal2
AS
BEGIN
IF EXISTS (SELECT * FROM ModeControl WHERE Model = 'POSTING')
RAISERROR...
-- Perform Normal2 operations
END
Obviously, if you have a full-blown data access layer and some framework bits, you can decorate your methods and use reflection to automatically categorize your methods and wrap them with checks about the unallowed modes to tie it into some kind of state-machine-type thing.