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 |
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 > > |
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 >> >> > > |
Free forum by Nabble | Edit this page |