Транзакции с TransactionScope в Sql Compact Edition 3.5 - PullRequest
3 голосов
/ 18 сентября 2009

У меня вопрос, я разрабатываю небольшое приложение для рабочего стола в Win Forms. Я использую SQL CE 3.5 SP1 для базы данных.

Когда я делаю вставки в несколько таблиц несколькими способами, я использую TansactionScope. Когда я использую только эти методы, я хочу использовать обычную транзакцию из соединения с базой данных.

Есть ли способ проверить вызываемый метод, если соединение с БД находится в области транзакции ??

Ответ, чтобы переслать эту информацию методу, в будущем будет плохим, мы изменим реализацию SQL Ce на нормальный SQL, и тогда я не буду менять реализацию, так что это не очень хорошая идея.

Решением, которое я использовал ранее в каждой транзакции mthod от ADO, но она была неправильной, потому что за пределами транзакции был TransactionScope, который не выполнял откат этого транс. Поэтому я решил удалить все транзакции ADO, а затем откат был в порядке, поэтому я не хочу знать, когда я могу использовать ADO, а когда нет ...

1 Ответ

2 голосов
/ 18 сентября 2009

Я не уверен, что они будут работать в Compact Edition 3.5, но это то, что используют другие выпуски SQL Server:

XACT_STATE () сообщает о состоянии транзакции сеанса, указывая, имеет ли сеанс активную транзакцию, и может ли транзакция быть принятой. Возвращает три значения:

  • 1, у сеанса активная транзакция. Сеанс может выполнять любые действия, включая запись данных и фиксацию транзакции.
  • 0, для сеанса нет активных транзакций.
  • -1, в сеансе имеется активная транзакция, но произошла ошибка, из-за которой транзакция была классифицирована как незафиксированная транзакция. Сеанс не может зафиксировать транзакцию или выполнить откат до точки сохранения; он может только запросить полный откат транзакции. Сеанс не может выполнять никаких операций записи, пока не откатит транзакцию. Сеанс может выполнять только операции чтения, пока он не откатит транзакцию. После отката транзакции сеанс может выполнять операции чтения и записи и может начать новую транзакцию.

@@ TRANCOUNT Возвращает количество активных транзакций для текущего соединения.

  • 0, не в транзакции
  • 1, в транзакции
  • n, во вложенной транзакции

РЕДАКТИРОВАТЬ base don OP's comments Попробуйте этот запрос:

SELECT
    *
    FROM sys.dm_tran_session_transactions
    WHERE session_id=@@SPID

или это, чтобы получить больше информации:

SELECT
    *
    FROM sys.dm_tran_session_transactions             s
        INNER JOIN sys.dm_tran_active_transactions    a On s.transaction_id=a.transaction_id
    WHERE s.session_id=@@SPID
...