При разборе ошибок в логе Postgres 9.1.3 обнаружил, что в некоторых случаях транзакция реально коммитится только в момент диссконнекта, а не тогда, когда клиент говорит COMMIT.
Соединение происходит через ZeosDB.
Как такое может быть?
Ниже пример лога, иллюстрирующий сказанное
1.
2.
3.
13:25:16.275 GST (1405) 6264 idleLOG: statement: BEGIN
13:25:16.290 GST (1405) 6264 idle in transactionLOG: statement: SET TRANSACTION ISOLATION LEVEL READ COMMITTED
13:25:17.072 GST (1405) 6264 idle in transactionLOG: statement: select last_crc as res from reply_nodes where gpers_user_id = 178
Получили last_crc = 985398385
1.
13:25:17.087 GST (1405) 6264 idle in transactionLOG: statement: COMMIT
Меняем значение last_crc на 1725194500, комитим
1.
2.
3.
4.
13:25:27.697 GST (1405) 6264 idleLOG: statement: BEGIN
13:25:27.728 GST (1405) 6264 idle in transactionLOG: statement: SET TRANSACTION ISOLATION LEVEL READ COMMITTED
13:26:35.556 GST (1405) 6264 idle in transactionLOG: statement: update reply_nodes set last_crc = 1725194500 where gpers_user_id = 178
13:26:35.572 GST (1405) 6264 idle in transactionLOG: statement: COMMIT
Читаем значение last_crc
1.
2.
3.
4.
13:30:33.556 GST (18780) 6876 authenticationLOG: connection authorized:
13:30:33.634 GST (18780) 6876 idleLOG: statement: BEGIN
13:30:33.650 GST (18780) 6876 idle in transactionLOG: statement: SET TRANSACTION ISOLATION LEVEL READ COMMITTED
13:30:34.415 GST (18780) 6876 idle in transactionLOG: statement: select last_crc as res from reply_nodes where gpers_user_id = 178
Получили last_crc = 985398385, значение, которое было до коммита
1.
13:30:34.447 GST (18780) 6876 idle in transactionLOG: statement: COMMIT
У клиента оборвалось соединение
1.
2.
3.
4.
13:33:32.072 GST (1405) 6264 idleLOG: could not send data to client: No connection could be made because the target machine actively refused it.
13:33:32.072 GST (1405) 6264 idleLOG: could not receive data from client: No connection could be made because the target machine actively refused it.
13:33:32.072 GST (1405) 6264 idleLOG: unexpected EOF on client connection
13:33:32.072 GST (1405) 6264 idleLOG: disconnection: session time: 0:08:15.969
Читаем значение last_crc
1.
2.
3.
13:33:41.181 GST (22857) 7872 idleLOG: statement: BEGIN
13:33:41.197 GST (22857) 7872 idle in transactionLOG: statement: SET TRANSACTION ISOLATION LEVEL READ COMMITTED
13:33:41.931 GST (22857) 7872 idle in transactionLOG: statement: select last_crc as res from reply_nodes where gpers_user_id = 178
Получили 1725194500, закоммитившееся только после разрыва соединения
1.
13:33:41.978 GST (22857) 7872 idle in transactionLOG: statement: COMMIT