Как проверить, что есть транзакция, которая еще не зафиксирована в SQL Server 2005? - PullRequest
31 голосов
/ 11 июня 2009

Кто-нибудь знает команду, чтобы проверить, есть ли незафиксированная транзакция в SQL Server 2005?

Ответы [ 6 ]

39 голосов
/ 11 июня 2009

используйте @@ trancount или sys.dm_tran_active_transactions DMV в sql 2005, 2008

24 голосов
/ 11 июня 2009

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

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

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

  • 0, не в транзакции
  • 1, в транзакции
  • n, во вложенной транзакции
7 голосов
/ 11 июня 2009

пробег

DBCC OPENTRAN
5 голосов
/ 28 апреля 2014
SELECT
    trans.session_id AS [SESSION ID],
    ESes.host_name AS [HOST NAME],login_name AS [Login NAME],
    trans.transaction_id AS [TRANSACTION ID],
    tas.name AS [TRANSACTION NAME],tas.transaction_begin_time AS [TRANSACTION BEGIN TIME],
    tds.database_id AS [DATABASE ID],DBs.name AS [DATABASE NAME]
FROM sys.dm_tran_active_transactions tas
JOIN sys.dm_tran_session_transactions trans
ON (trans.transaction_id=tas.transaction_id)
LEFT OUTER JOIN sys.dm_tran_database_transactions tds
ON (tas.transaction_id = tds.transaction_id )
LEFT OUTER JOIN sys.databases AS DBs
ON tds.database_id = DBs.database_id
LEFT OUTER JOIN sys.dm_exec_sessions AS ESes
ON trans.session_id = ESes.session_id
WHERE ESes.session_id IS NOT NULL

- имя БД будет получено только при выполнении команды SELECT @@ TRANCOUNT. Иначе NULL

выполнить приведенный выше код ... Даст подробные сведения о сеансе, в котором произошла транзакция.

2 голосов
/ 24 июня 2016

Подводя итог, можно выделить несколько методов:

  1. SELECT @@ trancount
  2. DBCC OPENTRAN
  3. SELECT XACT_STATE ()
  4. sp_lock
  5. SELECT * FROM sys.dm_tran_active_transactions
0 голосов
/ 11 июня 2009

sp_who2 sp_lock

...