sp_xact_loginfo can be used for periodically monitoring the longest running transaction per database.
For example, a stored procedure can be formed around sp_xact_loginfo in which it populates the tables with the oldest active transaction information and populates a user defined table. The execution of this stored procedure can be periodic, at desired frequency through job scheduler.
/*
** Stored procedure assumes presence of a pre-created table
** for monitoring oldest active transactions with following
** table definition:
**
** create table oldest_active_xact(
** dbid int,
** oldestactivexact_span int,
** startxactpagenum int,
** spid int,
** xactstarttime varchar(27),
** startlogpagenum int,
** stppage bigint,
** sec_truncpoint_block int,
** can_free_wo_kill int,
** dump_in_progress int,
** nolog int,
** username varchar(30) null)
*/
create procedure sp_record_oldestactivexact
@dbname varchar(30)
as
declare @dbid int,
@oats_span_pct int,
@oat_startpage bigint,
@firstlog_page bigint,
@canfree_withoutabort int,
@stp_blocking int,
@stp_page bigint,
@dump_in_progress int,
@oat_spid int,
@oat_starttime varchar(27),
@activexact int,
@free_with_dumptran_pct int,
@errorcode int,
@username varchar(30)
select @dbid = db_id(@dbname)
exec sp_xact_loginfo @dbid,
'oldestactive',
NULL,
0,
0,
@span_pct = @oats_span_pct output,
@startpage = @oat_startpage output,
@xact_spid = @oat_spid output,
@starttime = @oat_starttime output,
@firstlog_page = @firstlog_page output,
@stp_page = @stp_page output,
@stp_blocking = @stp_blocking output,
@canfree_without_abort_pct = @free_with_dumptran_pct output,
@dump_in_progress = @dump_in_progress output,
@activexact = @activexact output,
@errorcode = @errorcode output
if (@activexact = 1)
begin
print "activexact is true"
select @username = suser_name(sysproc.uid)
from master..systransactions systran,
master..sysprocesses sysproc
where systran.spid = @oat_spid
and systran.spid = sysproc.spid
insert into oldest_active_xact
values(
@dbid,
@oats_span_pct,
@oat_startpage,
@oat_spid,
@oat_starttime,
@firstlog_page,
@stp_page,
@stp_blocking,
@free_with_dumptran_pct,
@dump_in_progress,
@activexact,@username)
end
else
begin
print "activexact is false"
insert into oldest_active_xact values(
@dbid,
@oats_span_pct,
@oat_startpage,
@oat_spid,getdate(),
@firstlog_page,
@stp_page,
@stp_blocking,
@free_with_dumptran_pct,
@dump_in_progress,
@activexact,NULL)
end