1) статья на википедии:
https://ru.wikipedia.org/wiki/%D0%A3%D1%80%D0%BE%D...
Потерянное обновление (lost update):
2 запроса одновременно меняют значение поля в строке таблицы
UPDATE tbl1 SET f2=f2+20 WHERE f1=1; UPDATE tbl1 SET f2=f2+25 WHERE f1=1;
В результате значение поля f2 по завершении обеих транзакций может увеличиться не на 45, а на 20 или 25, то есть одна из изменяющих данные транзакций «пропадёт».
Вопрос: учитывая, что каждый индивидуальный запрос в ms sql (и я читал, что не только в нем, а во-всех СУБД, которые поддерживают транзакции) выполняется в неявной автоматической транзакции, то с чего вдруг станет возможно "потерянное обновление"? Т.е. второй update же не сможет прочитать значение f2, пока автоматическая транзакция первого update не завершится.
Даже если предположим, что автор писал текст, предполагая отсутствие автоматических транзакций, то не понятно следующее: поскольку в ms sql автоматические транзакции точно есть, то для чего в ms sql в явных транзакциях есть поддержка уровня изоляции read uncommitted, который защищает только от "потерянных обновлений"? Ведь даже без явных транзакций итак должна быть защита от них, т.к. работают автоматические транзакции?
2) статья на хабре:
https://habrahabr.ru/company/infopulse/blog/261097/ - раздел
Потерянное обновление – Интерпретация №2
он там приводит таблицу, в которой 2 параллельных update апдейтят одно и то же поле в БД аналогично тому, как было в статье в википедии. Но у автора на хабре оба запроса заключены в транзакции BEGIN TRAN; COMMIT TRAN; , но в результате он пишет, что произойдет "потерянное обновление".
Вопрос: как может произойти потерянное обновление, если оба его запроса выполняются каждый внутри своей транзакции?