Based on what you've said, it seems like QGIS might not be ending the transaction, but it could be something else entirely.
The easiest way to answer your question is to look at what postgres is doing. I'm assuming your postgres server is on Unix or Mac, because this won't work on windows.
First thing is look at what your postgres processes say they're doing:
% ps axw|grep postgres
You should see some lines that look like this:
19471 ? Ss 0:00 postgres: someuser somedatabase 192.168.0.1(33812) idle
That shows that username "someuser" is connected to database "somedatabase" from IP address 192.168.0.1 and port 33812. More importantly, it shows that the session is not doing anything – it's idle. That's fine.
However, if you see something like:
19471 ? Ss 0:00 postgres: someuser somedatabase 192.168.0.1(33812) INSERT
Then you know that the database is doing an INSERT for that session, you might also see "SELECT", "UPDATE", etc.. What you want to do is look for something that isn't quickly going away. If you have a session from your IP address that stays in non-idle mode, especially if it's doing a modification that could be problem.
Another thing you might see is "idle in transaction" – if that persists for a while, then that's very bad and probably indicative of a bug in the client application. That means it has started a transaction, done something, then not ended the transaction, which could block all other access to a table or tables.
If this method doesn't tell you anything, you can start digging deeper. The first place would be to make sure that statement logging is enabled on your postgres server, and then look at the logs it generates and see if anything "funny" is going on. See: http://www.postgresql.org/docs/current/static/runtime-config-logging.html You'll probably want log_statement = all enabled, at least temporarily.
There's more you can do, but this is a good place to start.