DBMS には隔離レベルと言うのがあって、 PostgreSQL の場合少し特殊みたいです。
デフォルトでは Read Committed なんだけど、 Transaction 中の Update 後に、他の Transaction による SELECT は Commit を待たずに実行できるようだ。
trans1 | trans2
--------+--------
BEGIN; |BEGIN;
UPDATE; |
|SELECT; <- update 前のレコードを参照
COMMIT; |
|SELECT; <- update 後のレコードを参照
更新-更新
trans1 | trans2
--------+--------
BEGIN; |BEGIN;
UPDATE; |
|UPDATE; <- COMMIT/ROLLBACK されるまで待つ
COMMIT; | <- COMMIT された内容に対して UPDATE を実行
|COMMIT;
SQLServer だと SELECT も待つんだけどね。だって Transaction 中はそのデータが Commit されるか Rollback されるか分からない状態なわけだからです。