Ответ на задание 1

Перевод денежных средств состоит как минимум из двух связанных операций:

  1. уменьшить баланс первого счета;
  2. увеличить баланс второго счета.

Эти операции должны выполняться как единое целое.

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:

Эти свойства позволяют СУБД надежно выполнять связанные операции даже при одновременной работе большого количества пользователей.