2017-08-30 4 views
0

に私はこの(VB.NET)のようなトランザクション追跡.NETトランザクションは、SQL

Dim objTransaction As New Transaction(IsolationLevel.ReadCommitted, "OpenTransaction") 

プロセスを行い、その後、

objTransaction.Commit() 
objTransaction.Dispose() 

または

objTransaction.Rollback() 
でそれを閉じてを定義します

エラーがある場合。

トランザクションが開いている場合、SQL内で "OpenTransaction"を見つけるにはどうすればよいですか?

私は

SELECT * FROM sys.dm_tran_active_transactions 

を行うと、それができます - 名前= "user_transactionに" ではなく、 "OpenTransactionを"。私がSQL内で与えた名前は、どのようにして見つけることができますか?

(私はいくつかのユーザーがウェブページ上でさまざまなことをしていますが、SQL内で長時間実行されているオープントランザクションがありますが、コード内で何を挙げているのかわかりません)

+0

user_transactionはあなたのトランザクションです。さらに、sys.dm_exec_requestsを使用してSQLテキストを知ることができます – TheGameiswar

+0

ありがとうございます。しかし、数十の "user_transaction"が存在する可能性があります。 私は、SQLを見つけるためにSPID、そして "DBCC INPUTBUFFER(XX)"を見つけることができます。しかし、SQLは複数の場所で似ている可能性があるので、私は実際にコードで指定したトランザクション名が必要です。 – Bibbs

答えて

0

この目的のためにSQLプロファイラを使用することができます。

:あなたはまた、トランザクションを監視するには、このクエリを使用することができます詳細については、チェック thisリンク

UPDATE

トレース

、あなたのフィルタを設定して起動し、このようなSQL管理スタジオ内でそれを起動することができます
USE [master] 
GO 
CREATE PROCEDURE [dbo].[sp_who3] 

AS 
BEGIN 

SET 
    TRANSACTION isolation level READ uncommitted; 
SELECT 
    SPID = er.session_id, 
    BlkBy = 
    CASE 
     WHEN 
     lead_blocker = 1 
     THEN 
     - 1 
     ELSE 
     er.blocking_session_id 
    END 
, ElapsedMS = er.total_elapsed_time , CPU = er.cpu_time , IOReads = er.logical_reads + er.reads , IOWrites = er.writes , Executions = ec.execution_count , CommandType = er.command , LastWaitType = er.last_wait_type , ObjectName = Object_schema_name(qt.objectid, dbid) + '.' + Object_name(qt.objectid, qt.dbid) , SQLStatement = Substring (qt.text, er.statement_start_offset/2, 
    CASE 
     WHEN 
     (
      CASE 
       WHEN 
        er.statement_end_offset = - 1 
       THEN 
        Len(CONVERT(NVARCHAR(max), qt.text)) * 2 
       ELSE 
        er.statement_end_offset 
      END 
      - er.statement_start_offset/2 
     ) 
     < 0 
     THEN 
     0 
     ELSE 
     CASE 
      WHEN 
       er.statement_end_offset = - 1 
      THEN 
       Len(CONVERT(NVARCHAR(max), qt.text)) * 2 
      ELSE 
       er.statement_end_offset 
     END 
     - er.statement_start_offset/2 
    END 
) , STATUS = ses.status , [Login] = ses.login_name , Host = ses.host_name , DBName = Db_name(er.database_id) , StartTime = er.start_time , Protocol = con.net_transport , transaction_isolation = 
    CASE 
     ses.transaction_isolation_level 
     WHEN 
     0 
     THEN 
     'Unspecified' 
     WHEN 
     1 
     THEN 
     'Read Uncommitted' 
     WHEN 
     2 
     THEN 
     'Read Committed' 
     WHEN 
     3 
     THEN 
     'Repeatable' 
     WHEN 
     4 
     THEN 
     'Serializable' 
     WHEN 
     5 
     THEN 
     'Snapshot' 
    END 
, ConnectionWrites = con.num_writes , ConnectionReads = con.num_reads , ClientAddress = con.client_net_address , Authentication = con.auth_scheme , DatetimeSnapshot = Getdate() , plan_handle = er.plan_handle 
FROM 
    sys.dm_exec_requests er 
    LEFT JOIN 
     sys.dm_exec_sessions ses 
     ON ses.session_id = er.session_id 
    LEFT JOIN 
     sys.dm_exec_connections con 
     ON con.session_id = ses.session_id OUTER apply sys.Dm_exec_sql_text(er.sql_handle) AS qt OUTER apply ( 
     SELECT 
     execution_count = Max(cp.usecounts) 
     FROM 
     sys.dm_exec_cached_plans cp 
     WHERE 
     cp.plan_handle = er.plan_handle) ec OUTER apply ( 
     SELECT 
      lead_blocker = 1 
     FROM 
      master.dbo.sysprocesses sp 
     WHERE 
      sp.spid IN 
      (
       SELECT 
        blocked 
       FROM 
        master.dbo.sysprocesses WITH (nolock) 
       WHERE 
        blocked != 0 
      ) 
      AND sp.blocked = 0 
      AND sp.spid = er.session_id) lb 
     WHERE 
      er.sql_handle IS NOT NULL 
      AND er.session_id != @@SPID 
     ORDER BY 
      CASE 
       WHEN 
        lb.lead_blocker = 1 
       THEN 
        - 1 * 1000 
       ELSE 
        - er.blocking_session_id 
      END 
, er.blocking_session_id DESC, er.logical_reads + er.reads DESC, er.session_id; 
END 

とSPを作成します。あなたはそれがあなたのユーザーがあなたもあなたの必要性にそれを編集することができていることを、実行中のすべてのトランザクションを与える

EXECが

をsp_who3使用することができます。

+0

ありがとうございます。しかし、私は積極的にではなく、これを反応的に行う必要があります。 – Bibbs

+0

私の更新を確認してください –

+0

私は、トランザクションが作成された後にブレークポイントを入れて、コードを実行します。トランザクションはsys.dm_tran_active_transactionsに表示され、sys.dm_tran_session_transactionsにリンクします。しかし、あなたのクエリ(またはそれに似たもの)ではなく、私がコードで与えるトランザクション名に到達できません。データをsys.dm_exec_sessionsにプッシュするには、 'Context_Info'を読み上げる必要があるかもしれません。 – Bibbs

関連する問題