Alex,
Yes, this concurrency thing can be tricky.
Try to put your operations within a single transaction whenever possible. Which really is... by
default! The de facto way to do things.
A DB transaction can help you keep your operations altogether, so error
handling and rollback is easy.
If you ever need to fork a new DB transaction to do store some data, make sure you closely examine
the data you're storing in the forked transaction. Make sure that data is NOT somehow related to
the data you're storing in your main transaction.
One example is low-level logging. Like ServerHit entity?
If you're doing low-level logging, chances are you'll need forked transactions. However, make
doubly sure that your low-level logs are not coupled to the data you're handling in your main
transaction.
Again, simply put everything in a single transaction by default. And if you have to fork a new
transaction, do it carefully.
Jonathon
David E Jones wrote:
Just standard database locking stuff. You have a couple of options:
1. change the code to be in the same transaction as the one that has the
record locked
2. wait for the lock to clear
Chances are you have either:
1. a dead-lock where thread A has a lock on record A and is waiting for
a lock on record B, and thread B has a lock on record B and is waiting
for a lock on record A
2. a paused transaction on a thread with a lock on record A, and the new
transaction attached to that thread is trying to use record A (read or
write)
So, change your code to make sure these don't happen, or to recover
nicely when they do. Not that this is always easy...
Good luck!
-David
Alex Arbit wrote:
As an update to my previous e-mail today, I think I've narrowed down the
issue.
When I try to commit data to the Subscription entity, it stalls, when I
try the same action to another table, it succeeds. It looks like the
Subscription entity is locked. Is there a way to unlock an entity?
I'm running Postgres with isolation level: read committed.
Thanks!
-Alex