Transactions however could lead to other problems (performance, deadlocks etc.) and since those things like above are not a real issue (they don't occur too often) and no time to do that, we leave it as it is.
But of course if it will become necessary, we will rewrite some important parts to use it.
And your first solution:
Yea, but 1 splits into:1. Player A script acquires lock on project
2. Player A script checks if there's room for 150 meat in the project
3. Player B script waits on lock
(...)
1a. Check if there's a lock already.
1b. Set lock flag (if not already locked).
So two processes could move through 1a and we have the problem again.

