2009-06-11 31 views

Respuesta

8

plazo

DBCC OPENTRAN 
19

XACT_STATE() informa del estado de la transacción de la sesión, indicando si la sesión tiene una transacción activa, y si la transacción puede o no ser comprometida. Devuelve tres valores:

  • 1, La sesión tiene una transacción activa. La sesión puede realizar cualquier acción, incluso escribir datos y confirmar la transacción.
  • 0, no hay transacción activa para la sesión.
  • -1, la sesión tiene una transacción activa, pero se ha producido un error que ha causado que la transacción se clasifique como una transacción no confirmable. La sesión no puede comprometer la transacción o retroceder a un punto de rescate; solo puede solicitar una reversión completa de la transacción. La sesión no puede realizar ninguna operación de escritura hasta que revierte la transacción. La sesión solo puede realizar operaciones de lectura hasta que revierte la transacción. Una vez que la transacción se ha retrotraído, la sesión puede realizar operaciones de lectura y escritura y puede comenzar una nueva transacción.

@@ TRANCOUNT Devuelve el número de transacciones activas para la conexión actual.

  • 0, no en una transacción
  • 1, en una transacción
  • n, en una transacción anidada
+1

+1 muy bien explicar ... cómo realizar la reversión completa de la transacción como dijiste 'La sesión no puede comprometer la transacción o retrotraer a un punto de rescate; solo puede solicitar una reversión completa de la transacción. . ¿Qué quieres decir con la reversión completa? –

+1

@KhurramAli, "-1" significa que no puede usar "commit" o "rollback YourSavePoint", pero debe usar "rollback", que básicamente establece @@ transcount para poner a cero cada transacción anidada. –

5
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 

--db voluntad obtener solo cuando se ejecuta un comando SELECT @@ TRANCOUNT. de otro modo NULO

ejecutar el código anterior ... les dará a los detalles de la sesión en la que occures la transacción ..

0

En resumen, existen varios métodos:

  1. SELECT @@ trancount
  2. DBCC OPENTRAN
  3. SELECT XACT_STATE()
  4. sp_lock
  5. SELECT * FROM sys.dm_tran_active_transactions
Cuestiones relacionadas