Ответ на задание 1
Перевод денежных средств состоит как минимум из двух
связанных операций:
Эти операции должны выполняться как единое целое.
BEGIN;
UPDATE Account
SET Balance = Balance - 50000
WHERE AccountID = 1;
UPDATE Account
SET Balance = Balance + 50000
WHERE AccountID = 2;
COMMIT;
Команда BEGIN начинает транзакцию.
После выполнения обеих операций команда:
COMMIT;
фиксирует изменения в базе данных.
Транзакция соответствует принципу атомарности: если
перевод не может быть выполнен полностью, частичное изменение данных не должно
сохраняться.
Например, недопустима ситуация, когда 50 000 тенге уже
списаны с первого счета, но из-за ошибки не были зачислены на второй.
Ответ на задание 2
Для отмены изменений текущей транзакции используется команда
ROLLBACK.
Например:
BEGIN;
UPDATE Account
SET Balance = Balance - 50000
WHERE AccountID = 1;
UPDATE Account
SET Balance = Balance + 50000
WHERE AccountID = 2;
ROLLBACK;
После выполнения ROLLBACK изменения, произведенные этими
операциями внутри текущей транзакции, не будут зафиксированы.
Например, до начала операции:
AccountID Balance
---------------------
1 300000
2 150000
В ходе транзакции значения временно изменились:
1 250000
2 200000
Но после ROLLBACK база возвращается к исходному состоянию:
1 300000
2 150000
Таким образом:
Это особенно важно при выполнении нескольких взаимосвязанных
операций.
Ответ на задание 3
При одновременной работе нескольких пользователей могут
возникать проблемы конкурентного доступа.
Например, имеется товар:
ProductID = 10
Quantity = 5
Два пользователя одновременно считывают значение Quantity =
5.
Первый пользователь уменьшает количество на 1 и получает:
Quantity = 4
Второй пользователь также использует ранее считанное
значение 5, уменьшает его на 1 и записывает:
Quantity = 4
Хотя было выполнено две операции продажи, итоговое
количество стало 4, а должно было стать 3. Такая ситуация является примером потерянного
обновления (Lost Update).
При конкурентной работе также могут возникать:
Для управления такими ситуациями СУБД использует механизмы
изоляции транзакций, блокировки и/или многоверсионное управление конкурентным
доступом (MVCC).
В SQL стандартно выделяются уровни изоляции:
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ
SERIALIZABLE
Чем выше уровень изоляции, тем сильнее защита от конфликтов
между параллельными транзакциями, хотя это может влиять на производительность и
степень параллелизма.
Корректность транзакций обычно рассматривают через свойства ACID:
Эти свойства позволяют СУБД надежно выполнять связанные
операции даже при одновременной работе большого количества пользователей.