2009-06-11 5 views

Répondre

8

run

DBCC OPENTRAN 
19

XACT_STATE() indique l'état de la transaction d'une session, ce qui indique si la session ait ou non une transaction active, et si oui ou non la transaction est susceptible d'être engagée. Il renvoie trois valeurs:

  • 1, La session a une transaction active. La session peut effectuer toutes les actions, y compris l'écriture de données et la validation de la transaction.
  • 0, Aucune transaction n'est active pour la session.
  • -1, La session a une transaction active, mais une erreur s'est produite qui a entraîné la transaction à classer comme une transaction non autorisée. La session ne peut pas valider la transaction ou revenir à un point de sauvegarde; il ne peut demander qu'une annulation complète de la transaction. La session ne peut effectuer aucune opération d'écriture tant qu'elle n'a pas annulé la transaction. La session peut uniquement effectuer des opérations de lecture jusqu'à ce qu'elle annule la transaction. Une fois la transaction annulée, la session peut effectuer des opérations de lecture et d'écriture et lancer une nouvelle transaction.

@@ TRANCOUNT Renvoie le nombre de transactions actives pour la connexion en cours.

  • 0, pas dans une transaction
  • 1, dans une transaction
  • n, dans une transaction imbriquée
+1

+1 très bien expliquer .. comment effectuer une annulation complète de la transaction comme vous l'avez dit 'La session ne peut pas valider la transaction ou revenir à un point de sauvegarde; il ne peut demander qu'une annulation complète de la transaction. » . que voulez-vous dire retour complet? –

+1

@KhurramAli, "-1" signifie que vous ne pouvez pas utiliser "commit" ou "rollback YourSavePoint", mais vous devez utiliser "rollback" qui définit fondamentalement @@ transcount à zéro annulant chaque transaction imbriquée. –

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 

nom --db sera get uniquement lorsqu'une commande SELECT @@ TRANCOUNT est exécutée.insert NULL

exécuter le code ci-dessus ... Est-ce que donner les détails de la session dans laquelle la transaction a lieu ..

0

Pour résumer, il existe plusieurs méthodes:

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