2013-06-19 3 views
0

Я пытаюсь понять, как эта команда SQL работает:Объяснение SQL: BEGIN, COMMIT flow?

BEGIN; 
UPDATE post SET hits = hits + 1; 
-- run from another session: DELETE FROM post WHERE hits = 10; 
COMMIT; 

Скажет, мы hahe строки с хитами = 9 и 10. Затем бежит этот запрос, а потом что? На что (и почему) будут выглядеть наши ряды?

+3

Почему бы вам просто не проверить? Я имею в виду - для запуска 2 терминалов требуется 10 секунд и теста. И вы получите ценную информацию таким образом, чтобы научить вас больше. –

+0

Но как протестировать его в этом очень небольшом количестве времени, когда транзакция активна (между BEGIN и COMMIT)? – tunarob

+0

Начало транзакции, выпуск обновления. затем в другом psql запустите удаление. –

ответ

1

Это зависит от уровня изоляции транзакции в каждом сеансе, но по умолчанию
все изменения, сделанные UPDATE, будут видны другим сеансам только после выполнения COMMIT.
Итак, ваш сеанс DELETE будет вести себя так, как будто не было ОБНОВЛЕНИЯ вообще.

+0

В Postgres нет уровня изоляции, который когда-либо сделает незафиксированные данные видимыми для других транзакций. –

+1

http://www.postgresql.org/docs/9.1/static/transaction-iso.html Прочитайте Uncommuted – VitaliyG

+0

Итак, если я хорошо понимаю - BEGIN - COMMIT ставит блокировку на затронутые строки и до тех пор, пока COMMIT не строит какой-то невидимый для других запросов? – tunarob

Смежные вопросы