Предположим, имеется две транзакции, открытые различными приложениями, в которых выполнены следующие SQL-операторы:
| Транзакция 1
| Транзакция 2
|
| SELECT f2 FROM tbl1 WHERE f1=1; UPDATE tbl1 SET f2=f2+1 WHERE f1=1;
| SELECT f2 FROM tbl1 WHERE f1=1; SELECT f2 FROM tbl1 WHERE f1=1;
|
В транзакции 2 выбирается значение поля f2, затем в транзакции 1 изменяется значение поля f2. При повторной попытке выбора значения из поля f2 в транзакции 1 будет получен другой результат (рис. 7.1). Эта ситуация особенно неприемлема, когда данные считываются с целью их частичного изменения и обратной записи в базу данных.
Рис. 7.1. Неповторяющееся чтение
"Грязное" чтение
Предположим, имеется две транзакции, открытые различными приложениями, в которых выполнены следующие SQL-операторы:
| Транзакция 1
| Транзакция 2
|
| SELECT f2 FROM tbl1 WHERE f1=1; UPDATE tbl1 SET f2=f2+1 WHERE f1=1; ROLLBACK WORK;
| SELECT f2 FROM tbl1 WHERE f1=1;
|
В транзакции 1 изменяется значение поля f1, а затем в транзакции 2 выбирается значение поля f1. После этого происходит откат транзакции 1. В результате значение, полученное второй транзакцией, будет отличаться от значения, хранимого в базе данных.