когда фиксация фактически повлияет на таблицы при вызове процедуры?

#sql #sql-server

#sql #sql-сервер

Вопрос:

Я работаю с ms sql с помощью struts framework. При вызове процедуры я устанавливаю autocommit false в программе. при запуске процедуры я должен зафиксировать одну отдельную транзакцию, и это должно повлиять на таблицу извне, но она никогда не сохраняется до выполнения инструкции conn.commit() в программе. Есть ли какой-либо другой способ зафиксировать транзакцию в самой процедуре, чтобы повлиять на таблицу в конце отдельной транзакции в процедуре? Pl. скажите мне, если вы знаете.

Т.Сараванан

Комментарии:

1. Повторно помеченная, часть Java не имеет отношения к этому вопросу

Ответ №1:

Вы должны запускать и фиксировать / откатывать транзакцию на том же уровне, иначе вы вводите множество непредсказуемых путей — и, откровенно говоря, какой-то плохой дизайн. Итак: если вам нужно зафиксировать на сервере, используйте BEGIN TRAN / COMMIT TRAN в TSQL для локальной обработки транзакции.

Обратите внимание, однако, что обработка исключений / ошибок TSQL не так сложна, как обработка ошибок в вызывающем устройстве, таком как java / C #. Если проблема в том, что вы хотите отделить эту работу от другой несвязанной транзакции, то это зависит от того, как работает ваш вызывающий код:

  • если используются транзакции на уровне соединения, то вам нужно будет использовать отдельное соединение; просто запустите транзакцию в другом соединении, используя java / C # / любой другой transaction API (то есть, судя по звучанию, такой же, как ваш существующий код, но в другом соединении)
  • если он использует такие вещи, как транзакции на основе области видимости ( TransactionScope в C #; не уверен насчет Java и т.д. — но это транзакция LTM или DTC), Тогда вы можете явно создать новую область видимости, которая привязана либо к новой (изолированной) транзакции, либо к транзакции с нулевым значением (т. Е. внутренняя область видимости не включена)

Что касается влияния на таблицы… SQL Server обычно выполняет оптимистичные изменения, т.Е. да, изменения применяются немедленно (так что фиксация обходится дешево, а откат дороже) — однако, уровень изоляции обычно не позволяет другим SPID просматривать данные. Конкурирующий SPID с низким уровнем изоляции (или использующий NOLOCK подсказку) увидит незафиксированные данные, но это может быть фантомное / неповторяемое чтение, если данные в конечном итоге будут откатаны.