Как происходит обработка транзакций в конкретных ситуациях?

1. Выполняются ли транзакции в режиме автофиксации, если команда помещена в явную транзакцию? Например, когда код выглядит так:
BEGIN TRANSACTION firstTran UPDATE Test1 SET Value *= 10; COMMIT TRANSACTION
Будет ли UPDATE выполняться в отдельной подтранзакции или нет?

2. Какие типы команд помещаются в автофиксирующие транзакции, помимо DML (INSERT, UPDATE, DELETE)?

3. Уровни изоляции транзакций влияют на то, какие блокировки накладываются на объекты. Но влияют ли они на взаимодействие с другими блокировками в транзакциях?

4. Я понимаю, что оптимистичные уровни изоляции приводят к отсутствию блокировок в ущерб использованию tempdb. Но как это связано с обновлением данных? Накладывается ли монопольная блокировка на обновление данных? И если да, то учитывают ли другие транзакции с таким же уровнем изоляции эту блокировку при чтении и обновлении?
  • 11 февраля 2024 г. 12:38
Ответы на вопрос 1
1. В режиме автофиксации каждая индивидуальная команда является отдельной транзакцией, которая автоматически фиксируется (коммитится) после выполнения. Если же команда помещена в явную транзакцию (как в вашем примере с `BEGIN TRANSACTION` и `COMMIT TRANSACTION`), то эта команда будет частью указанной транзакции и не будет выполняться в отдельной подтранзакции. Таким образом, `UPDATE` в вашем примере будет частью транзакции `firstTran` и не будет автоматически фиксироваться до тех пор, пока не будет выполнена команда `COMMIT TRANSACTION`.

2. В дополнение к DML командам, таким как `INSERT`, `UPDATE`, и `DELETE`, автофиксацией также управляются другие типы операций, например DDL операции (например, `CREATE`, `ALTER`, `DROP` для объектов базы данных) и некоторые системные процедуры. При этом важно отметить, что для DDL операций не существует понятия отката транзакции; если такая операция была выполнена, то ее может отменить только соответствующая обратная операция.

3. Уровни изоляции транзакций определяют, какие данные можно читать во время транзакции и какие блокировки накладываются, чтобы обеспечить это поведение. Уровень изоляции влияет на то, как блокировки совместимы друг с другом между отдельными транзакциями. Например, на более строгих уровнях изоляции (например, SERIALIZABLE) система может накладывать более сильные блокировки, которые предотвращают другие транзакции от чтения или изменения заблокированных данных до окончания транзакции. На менее строгих уровнях (например, READ COMMITTED) блокировки менее ограничительны, и другие транзакции могут получить доступ к данным сразу после их фиксации.

4. Оптимистичные уровни изоляции, такие как snapshot изоляция или Read Committed Snapshot, позволяют избежать длительных блокировок на чтение, сохраняя версии изменяемых данных в специальной структуре внутри `tempdb`. Таким образом, транзакции, выполняющие чтение данных, могут видеть стабильные версии данных, не ожидая завершения блокирующих транзакций. Однако при выполнении операций обновления данных (UPDATE, DELETE, INSERT) система всё равно должна гарантировать целостность, поэтому накладывается монопольная (exclusive) блокировка на изменяемые строки данных. Другие транзакции с таким же уровнем изоляции будут видеть последнюю зафиксированную версию данных, и, если они попытаются выполнить обновление тех же данных, возможен конфликт версий, который разрешается с помощью механизма обнаружения конфликтов версий (version conflict detection).
Похожие вопросы