В настоящее время я читаю об уровнях изоляции базы данных и транзакционных явлениях. Грязные чтения очевидны, но Я не уверен насчет "Грязных записей" .
Все описания «грязной записи» говорят примерно так:
«Грязная запись - это когда процесс сохраняет данные файла, которые уже были изменены на диске другим процессом. последний процесс перезапишет данные первого. " (https://gerardnico.com/data/property/dirty_write).
Некоторые другие описания используют примеры для демонстрации «грязной записи», но не то, что произойдет, чтобы решить эту проблему: https://esb-dev.github.io/mat/IsoLevel.pdf
Это грязная запись из примера:
- Saldo начинается с 100
- T2 начинается: обновить Acct set Saldo = 200, где Acct = 1
- T1 начинается: обновление Acct set Saldo = 250, где Acct = 1
- T1 коммит => Saldo = 250
- T2 коммит => Saldo = 200
Я не уверен, что произойдет, когда уровень изоляции не позволяет "грязных записей" ...
- T1 не удается при фиксации , потому что изменение T2 не выполняется в это время
- T1 фиксируется успешно, а T2 фиксируется неудачно , потому что T1 (еще не зафиксировано) перезаписывает это изменение
- T1 и T2 фиксируются успешно, но T1 выигрывает молча (saldo 200 вместо 250)
Я действительно не уверен, чего ожидать от транзакции n management.
Пример, модифицированный:
- Saldo начинается с 100
- T1 начинается: update Acct set Saldo = 200, где Acct = 1
- T2 начинается: обновление Acct set Saldo = 250, где Acct = 1
- T2 фиксирует => Saldo =?
- T1 фиксирует => Saldo =?
У нас есть грязная запись здесь? И каков результат, если разрешена грязная запись?
- Saldo = 250, потому что последнее обновление выигрывает
- Saldo = 200, потому что последний коммит побед
И у меня есть дополнительный вопрос о Java / Spring JPA / Hibernate
Ранее я ожидал, что операторы write не будет отправлено в базу данных, пока hibernate не выполнит «commit». Я ошибаюсь? Некоторые уровни изоляции и явления имеют смысл только в том случае, если все операторы всегда мгновенно передаются в базу данных.