Какое поведение транзакции мы должны ожидать, если клиент умрет? - PullRequest
1 голос
/ 21 апреля 2011
BEGIN;

UPDATE saving SET balance = balance - 100.00 WHERE name = 'Alice';

UPDATE checking SET balance = balance + 100.00 WHERE name = 'Alice';

COMMIT

Во время этой транзакции мой клиент умирает до принятия.что бы я ожидал, состояние БД?

Позвольте мне использовать конкретный пример из http://java.sun.com/developer/onlineTraining/Programming/JDCBook/bmp4.html

Пример, показанный в конце страницы, имеет логику «коммит» или «откат»"явно.Но что произойдет, если клиентский процесс умирает сразу после операции:

"AuctionItem ai = home.create (продавец, описание, дни аукциона, стартовая цена, резюме);"

клиент не имеетполучил шанс отловить исключение для отката, и при этом он не имеет возможности сделать коммит.

Ответы [ 2 ]

2 голосов
/ 22 апреля 2011

В конце концов, механизм tcp keep alive в ОС прервет соединение. когда это произойдет, база данных откатит транзакцию, так как это единственный возможный вариант без явного принятия. Пока соединение активно и бездействует, у вас будет блокировка данных и запись в таблице pg_stat_activity, указывающая «простаивает в транзакции». Любые обновления другим подключением к строкам, в которых заблокирована транзакция, будут ожидать ее фиксации / отката.

Время ожидания tcp_keepalive по умолчанию составляет 2 часа и несколько нечетных минут для повторных попыток.

1 голос
/ 21 апреля 2011

Если нет автоматической фиксации, то значения не изменились бы, если СУБД не выполняет фиксацию

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...